summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorArne Döring <arne.doering@gmx.net>2019-07-27 07:21:47 +0200
committerAndreas Rumpf <rumpf_a@web.de>2019-07-27 07:21:47 +0200
commit1a770402784ed99099f1905e1e4c201020e03bca (patch)
treee9939001ec574dc078471d9ff0136e3144efe71d
parent2fdba334dac4d8f1673db38ab8e98df5bc5e73f6 (diff)
downloadNim-1a770402784ed99099f1905e1e4c201020e03bca.tar.gz
fix #11812 (#11829)
* fixes #11812
* fixes #10899
* fixes #11367
-rw-r--r--compiler/sigmatch.nim2
-rw-r--r--tests/misc/tlambdadonotation.nim78
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()