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>
This commit is contained in:
ringabout
2023-11-14 14:15:44 +08:00
committed by GitHub
parent 52784f32bb
commit 0dc3513613
2 changed files with 9 additions and 3 deletions

View File

@@ -82,7 +82,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
@@ -90,7 +90,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.