diff options
author | Jake Leahy <jake@leahy.dev> | 2023-05-25 15:08:36 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-25 07:08:36 +0200 |
commit | a8718d8a9e1aba7df55b1a3df1ce48a3f4f62bff (patch) | |
tree | cfb69c12c0ffa5fe2e57178ac2d97c3fae8c5626 | |
parent | b7925bf5c937bf3cb71290949d279872c4d0cb8e (diff) | |
download | Nim-a8718d8a9e1aba7df55b1a3df1ce48a3f4f62bff.tar.gz |
Fix const in async regression (#21898)
* Add test case for a const being used inside an async proc * Use `typeof` to get the type of the block instead of overloaded templates This removes the problem with the symbol having different types I am unsure why I didn't use this in the first place. IIRC I had problems with `typeof` when I first tried to use it in the original implementation
-rw-r--r-- | lib/pure/asyncmacro.nim | 12 | ||||
-rw-r--r-- | tests/async/t21893.nim | 13 |
2 files changed, 18 insertions, 7 deletions
diff --git a/lib/pure/asyncmacro.nim b/lib/pure/asyncmacro.nim index d80a47101..e41568b8c 100644 --- a/lib/pure/asyncmacro.nim +++ b/lib/pure/asyncmacro.nim @@ -221,13 +221,11 @@ proc asyncSingleProc(prc: NimNode): NimNode = procBody = newStmtList() let resultIdent = ident"result" procBody.add quote do: - template nimAsyncDispatchSetResult(x: `subRetType`) {.used.} = - # If the proc has implicit return then this will get called - `resultIdent` = x - template nimAsyncDispatchSetResult(x: untyped) {.used.} = - # If the proc doesn't have implicit return then this will get called - x - procBody.add newCall(ident"nimAsyncDispatchSetResult", blockStmt) + # Check whether there is an implicit return + when typeof(`blockStmt`) is void: + `blockStmt` + else: + `resultIdent` = `blockStmt` procBody.add(createFutureVarCompletions(futureVarIdents, nil)) procBody.insert(0): quote do: {.push warning[resultshadowed]: off.} diff --git a/tests/async/t21893.nim b/tests/async/t21893.nim new file mode 100644 index 000000000..658cb02eb --- /dev/null +++ b/tests/async/t21893.nim @@ -0,0 +1,13 @@ +discard """ +output: "@[97]\ntrue" +""" + +import asyncdispatch + +proc test(): Future[bool] {.async.} = + const S4 = @[byte('a')] + echo S4 + return true + +echo waitFor test() + |