Skip to content

Compiler internal error when defining local iterator variable. #17632

Open
@lscrd

Description

@lscrd

When defining an iterator variable, the program compiles successfully if the variable is global but causes an internal compiler error if it is local.

Example

The following program compiles and execute without any problem:

iterator iter(n: int): int {.closure.} =
  for i in 1..n:
    yield i

var it = iterator: int = (for i in iter(5): yield i)

echo it()
echo it()

But moving the definition of "it" in a procedure makes the compiler encounter an internal error: internal error: expr: var not init iter_4607114

iterator iter(n: int): int {.closure.} =
  for i in 1..n:
    yield i

proc p() =
  var it = iterator: int = (for i in iter(5): yield i)

  echo it()
  echo it()

p()

Current Output

internal error: expr: var not init iter_4607114
The error exists with devel compiler too.

Expected Output

No internal error, of course.

Possible Solution

Adding {.closure.} to the iterator defining the variable doesn’t solve the issue.
But changing the closure iterator to an inline iterator solves it.

Additional Information

There are previous issues related to iterator variable but as far as I know they are considered as closed.

$ nim -v
Nim Compiler Version 1.4.4 [Linux: amd64]

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions