From 08f094c4874eba9253e8b3a07de0fccef4c782b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20D=C3=B6ring?= Date: Sat, 27 Jul 2019 07:21:47 +0200 Subject: [PATCH] fix #11812 (#11829) * fixes #11812 * fixes #10899 * fixes #11367 (cherry picked from commit 1a770402784ed99099f1905e1e4c201020e03bca) --- compiler/sigmatch.nim | 2 +- tests/misc/tlambdadonotation.nim | 78 ++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 tests/misc/tlambdadonotation.nim diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index a999db0100..6762c9f440 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -2108,7 +2108,7 @@ proc paramTypesMatchAux(m: var TCandidate, f, a: PType, # lift do blocks without params to lambdas let p = c.graph let lifted = c.semExpr(c, newProcNode(nkDo, argOrig.info, body = argOrig, - params = p.emptyNode, name = p.emptyNode, pattern = p.emptyNode, + params = nkFormalParams.newTree(p.emptyNode), name = p.emptyNode, pattern = p.emptyNode, genericParams = p.emptyNode, pragmas = p.emptyNode, exceptions = p.emptyNode), {}) if f.kind == tyBuiltInTypeClass: inc m.genericMatches diff --git a/tests/misc/tlambdadonotation.nim b/tests/misc/tlambdadonotation.nim new file mode 100644 index 0000000000..af51efdbf3 --- /dev/null +++ b/tests/misc/tlambdadonotation.nim @@ -0,0 +1,78 @@ +discard """ +output: ''' +issue #11812 +issue #10899 +123 +issue #11367 +event consumed! +''' +""" + +echo "issue #11812" + +proc run(a: proc()) = a() + +proc main() = + var test: int + run(proc() = test = 0) + run do: + test = 0 + +main() + + +echo "issue #10899" + +proc foo(x: proc {.closure.}) = + x() + +proc bar = + var x = 123 + # foo proc = echo x #[ ok ]# + foo: echo x #[ SIGSEGV: Illegal storage access. (Attempt to read from nil?) ]# + +bar() + +echo "issue #11367" + +type + + EventCB = proc() + + Emitter = object + cb: EventCB + + Subscriber = object + discard + +proc newEmitter(): Emitter = + result + +proc on_event(self: var Emitter, cb: EventCB) = + self.cb = cb + +proc emit(self: Emitter) = + self.cb() + +proc newSubscriber(): Subscriber = + result + +proc consume(self: Subscriber) = + echo "event consumed!" + +proc main2() = + var emitter = newEmitter() + var subscriber = newSubscriber() + + proc foo() = + subscriber.consume() + + emitter.on_event() do: + subscriber.consume() + + # this works + # emitter.on_event(foo) + + emitter.emit() + +main2()