fix #13899 defer now works with async (#14723)

This commit is contained in:
Timothee Cour 2020-06-19 06:08:00 -07:00 • committed by GitHub
commit 2039e3e883
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 7 deletions

View file

@ -207,6 +207,9 @@ proc asyncSingleProc(prc: NimNode): NimNode {.compileTime.} =
futureVarIdents)
# 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))
if not subtypeIsVoid:

View file

@ -1,8 +1,3 @@
discard """
exitcode: 0
output: "ok"
"""
import json, asyncdispatch
block: #6100
let done = newFuture[int]()
@ -61,5 +56,21 @@ block: # 12743
waitFor prc()
echo "ok"
block: # issue #13899
proc someConnect() {.async.} =
await sleepAsync(1)
proc someClose() {.async.} =
await sleepAsync(2)
proc testFooFails(): Future[bool] {.async.} =
await someConnect()
defer:
await someClose()
result = true
proc testFooSucceed(): Future[bool] {.async.} =
try:
await someConnect()
finally:
await someClose()
result = true
doAssert waitFor testFooSucceed()
doAssert waitFor testFooFails()