diff options
author | huantian <davidtianli@gmail.com> | 2022-04-13 14:03:46 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-13 23:03:46 +0200 |
commit | ef7d7f24594b1ea560fbf25d3fa0d6c51122725f (patch) | |
tree | 15dc4511c81bc2a9ea366789d49a9f7862ed3d9f /lib/pure/asyncmacro.nim | |
parent | 98cebad7debddfb147ee22bc6f3d81221582c4d6 (diff) | |
download | Nim-ef7d7f24594b1ea560fbf25d3fa0d6c51122725f.tar.gz |
Better error message and tests for bad await (#19622)
* Better error message and tests for bad await * Use compiles to check if await is valid * temp: disable windows noasync test * Better error report, simplify test Co-authored-by: flywind <xzsflywind@gmail.com>
Diffstat (limited to 'lib/pure/asyncmacro.nim')
-rw-r--r-- | lib/pure/asyncmacro.nim | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/pure/asyncmacro.nim b/lib/pure/asyncmacro.nim index ce538913f..63c8e6e5c 100644 --- a/lib/pure/asyncmacro.nim +++ b/lib/pure/asyncmacro.nim @@ -126,9 +126,19 @@ template await*(f: typed): untyped {.used.} = error "await expects Future[T], got " & $typeof(f) template await*[T](f: Future[T]): auto {.used.} = - var internalTmpFuture: FutureBase = f - yield internalTmpFuture - (cast[typeof(f)](internalTmpFuture)).read() + template yieldFuture = yield FutureBase() + + when compiles(yieldFuture): + var internalTmpFuture: FutureBase = f + yield internalTmpFuture + (cast[typeof(f)](internalTmpFuture)).read() + else: + macro errorAsync(futureError: Future[T]) = + error( + "Can only 'await' inside a proc marked as 'async'. Use " & + "'waitFor' when calling an 'async' proc in a non-async scope instead", + futureError) + errorAsync(f) proc asyncSingleProc(prc: NimNode): NimNode = ## This macro transforms a single procedure into a closure iterator. |