From 710801d8804f90b46b1520a5c714f835d0a69ac3 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Tue, 14 Nov 2023 14:15:44 +0800 Subject: [PATCH] fixes #22932; treats closure iterators as pointers (#22934) fixes #22932 follow up https://github.com/nim-lang/Nim/pull/21629 --------- Co-authored-by: Nickolay Bukreyev (cherry picked from commit 0dc3513613f87beb6ab5a590360ced7c9d33b1e3) --- lib/pure/options.nim | 4 ++-- tests/stdlib/toptions.nim | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/pure/options.nim b/lib/pure/options.nim index 9dc4e096b3..262e2dc82a 100644 --- a/lib/pure/options.nim +++ b/lib/pure/options.nim @@ -81,7 +81,7 @@ when defined(nimPreviewSlimSystem): when (NimMajor, NimMinor) >= (1, 1): type - SomePointer = ref | ptr | pointer | proc + SomePointer = ref | ptr | pointer | proc | iterator {.closure.} else: type SomePointer = ref | ptr | pointer @@ -89,7 +89,7 @@ else: type Option*[T] = object ## An optional type that may or may not contain a value of type `T`. - ## When `T` is a a pointer type (`ptr`, `pointer`, `ref` or `proc`), + ## When `T` is a a pointer type (`ptr`, `pointer`, `ref`, `proc` or `iterator {.closure.}`), ## `none(T)` is represented as `nil`. when T is SomePointer: val: T diff --git a/tests/stdlib/toptions.nim b/tests/stdlib/toptions.nim index 4f1251abb5..63a10e746d 100644 --- a/tests/stdlib/toptions.nim +++ b/tests/stdlib/toptions.nim @@ -196,6 +196,12 @@ proc main() = doAssert x.isNone doAssert $x == "none(cstring)" - static: main() main() + +when not defined(js): + block: # bug #22932 + var it = iterator: int {.closure.} = discard + doAssert it.option.isSome # Passes. + it = nil + doAssert it.option.isNone # Passes.