diff options
author | Arne Döring <arne.doering@gmx.net> | 2019-07-27 07:21:47 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-07-27 07:21:47 +0200 |
commit | 1a770402784ed99099f1905e1e4c201020e03bca (patch) | |
tree | e9939001ec574dc078471d9ff0136e3144efe71d | |
parent | 2fdba334dac4d8f1673db38ab8e98df5bc5e73f6 (diff) | |
download | Nim-1a770402784ed99099f1905e1e4c201020e03bca.tar.gz |
fix #11812 (#11829)
* fixes #11812 * fixes #10899 * fixes #11367
-rw-r--r-- | compiler/sigmatch.nim | 2 | ||||
-rw-r--r-- | tests/misc/tlambdadonotation.nim | 78 |
2 files changed, 79 insertions, 1 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 828d25fe8..154d76209 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -2117,7 +2117,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 000000000..af51efdbf --- /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() |