Nim icon indicating copy to clipboard operation
Nim copied to clipboard

Compiler internal error when defining local iterator variable.

Open lscrd opened this issue 4 years ago • 1 comments

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]

lscrd avatar Apr 03 '21 18:04 lscrd