diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2021-02-24 17:43:13 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-24 17:43:13 +0100 |
commit | e9a287fe120501de4c4f70fbf687e0ceb9b75ee9 (patch) | |
tree | 26ef957bfc04b7813b0c5cce3a66aaeb98036d6e | |
parent | 8942586fa6a0b044198a24dd5030dd5bcdb6cc2d (diff) | |
download | Nim-e9a287fe120501de4c4f70fbf687e0ceb9b75ee9.tar.gz |
fixes #17170 (#17171)
-rw-r--r-- | compiler/ccgcalls.nim | 1 | ||||
-rw-r--r-- | compiler/closureiters.nim | 3 | ||||
-rw-r--r-- | tests/arc/torcmisc.nim | 34 |
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" + |