diff --git a/lib/pure/asyncmacro.nim b/lib/pure/asyncmacro.nim index 7ee324369dd9..1f89b15e7363 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 000000000000..99961e7b6dd5 --- /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()