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 <SirNickolas@users.noreply.github.com>
(cherry picked from commit 0dc3513613)
This commit is contained in:
ringabout
2023-11-14 14:15:44 +08:00
committed by narimiran
parent 39d0eb3a58
commit 710801d880
2 changed files with 9 additions and 3 deletions

View File

@@ -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

View File

@@ -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.