From da3274d1b3bb5cc737a5aca900dd231e4223fa60 Mon Sep 17 00:00:00 2001 From: Jake Leahy Date: Sat, 10 Dec 2022 04:10:33 +1100 Subject: [PATCH] Implicit return working for async proc (#20933) * Implicit return working for asyncdispatch proc Closes #11558 * Test case * Test that return value is actually used * Update tests/async/t11558.nim Co-authored-by: Andreas Rumpf --- lib/pure/asyncmacro.nim | 13 +++++++++++-- tests/async/t11558.nim | 13 +++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 tests/async/t11558.nim diff --git a/lib/pure/asyncmacro.nim b/lib/pure/asyncmacro.nim index 7ee324369d..1f89b15e73 100644 --- a/lib/pure/asyncmacro.nim +++ b/lib/pure/asyncmacro.nim @@ -214,9 +214,18 @@ proc asyncSingleProc(prc: NimNode): NimNode = # don't do anything with forward bodies (empty) if procBody.kind != nnkEmpty: # fix #13899, defer should not escape its original scope - procBody = newStmtList(newTree(nnkBlockStmt, newEmptyNode(), procBody)) - procBody.add(createFutureVarCompletions(futureVarIdents, nil)) + let blockStmt = newStmtList(newTree(nnkBlockStmt, newEmptyNode(), procBody)) + procBody = newStmtList() let resultIdent = ident"result" + procBody.add quote do: + template setResult(x: `subRetType`) {.used.} = + # If the proc has implicit return then this will get called + `resultIdent` = x + template setResult(x: untyped) {.used.} = + # If the proc doesn't have implicit return then this will get called + x + procBody.add newCall(ident"setResult", blockStmt) + procBody.add(createFutureVarCompletions(futureVarIdents, nil)) procBody.insert(0): quote do: {.push warning[resultshadowed]: off.} when `subRetType` isnot void: diff --git a/tests/async/t11558.nim b/tests/async/t11558.nim new file mode 100644 index 0000000000..99961e7b6d --- /dev/null +++ b/tests/async/t11558.nim @@ -0,0 +1,13 @@ +discard """ +output: "Hello\n9" +""" +import std/asyncdispatch + +proc foo(): Future[string] {.async.} = + "Hello" + +proc bar(): Future[int] {.async.} = + result = 9 + +echo waitFor foo() +echo waitFor bar()