summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2021-02-24 17:43:13 +0100
committerGitHub <noreply@github.com>2021-02-24 17:43:13 +0100
commite9a287fe120501de4c4f70fbf687e0ceb9b75ee9 (patch)
tree26ef957bfc04b7813b0c5cce3a66aaeb98036d6e
parent8942586fa6a0b044198a24dd5030dd5bcdb6cc2d (diff)
downloadNim-e9a287fe120501de4c4f70fbf687e0ceb9b75ee9.tar.gz
fixes #17170 (#17171)
-rw-r--r--compiler/ccgcalls.nim1
-rw-r--r--compiler/closureiters.nim3
-rw-r--r--tests/arc/torcmisc.nim34
3 files changed, 37 insertions, 1 deletions
diff --git a/compiler/ccgcalls.nim b/compiler/ccgcalls.nim
index 7c2a21a36..64b883087 100644
--- a/compiler/ccgcalls.nim
+++ b/compiler/ccgcalls.nim
@@ -289,6 +289,7 @@ proc genArg(p: BProc, n: PNode, param: PSym; call: PNode, needsTmp = false): Rop
   else:
     initLocExprSingleUse(p, n, a)
     result = rdLoc(withTmpIfNeeded(p, a, needsTmp))
+  #assert result != nil
 
 proc genArgNoParam(p: BProc, n: PNode, needsTmp = false): Rope =
   var a: TLoc
diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim
index 43dfc69ae..2270797ea 100644
--- a/compiler/closureiters.nim
+++ b/compiler/closureiters.nim
@@ -427,7 +427,8 @@ proc addExprAssgn(ctx: Ctx, output, input: PNode, sym: PSym) =
 
 proc convertExprBodyToAsgn(ctx: Ctx, exprBody: PNode, res: PSym): PNode =
   result = newNodeI(nkStmtList, exprBody.info)
-  ctx.addExprAssgn(result, exprBody, res)
+  if exprBody.typ != nil:
+    ctx.addExprAssgn(result, exprBody, res)
 
 proc newNotCall(g: ModuleGraph; e: PNode): PNode =
   result = newTree(nkCall, newSymNode(g.getSysMagic(e.info, "not", mNot), e.info), e)
diff --git a/tests/arc/torcmisc.nim b/tests/arc/torcmisc.nim
new file mode 100644
index 000000000..20dd18fb3
--- /dev/null
+++ b/tests/arc/torcmisc.nim
@@ -0,0 +1,34 @@
+discard """
+  output: '''success'''
+  cmd: "nim c --gc:orc -d:release $file"
+"""
+
+# bug #17170
+
+when true:
+  import asyncdispatch
+
+  type
+    Flags = ref object
+      returnedEof, reading: bool
+
+  proc dummy(): Future[string] {.async.} =
+    result = "foobar"
+
+  proc hello(s: Flags) {.async.} =
+    let buf =
+      try:
+        await dummy()
+      except CatchableError as exc:
+        # When an exception happens here, the Bufferstream is effectively
+        # broken and no more reads will be valid - for now, return EOF if it's
+        # called again, though this is not completely true - EOF represents an
+        # "orderly" shutdown and that's not what happened here..
+        s.returnedEof = true
+        raise exc
+      finally:
+        s.reading = false
+
+  waitFor hello(Flags())
+  echo "success"
+