nim-lang / Nim

Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority).
https://nim-lang.org
Other
16.63k stars 1.47k forks source link

Compiler internal error when defining local iterator variable. #17632

Open lscrd opened 3 years ago

lscrd commented 3 years ago

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]
ghost commented 3 years ago

Maybe related: https://github.com/nim-lang/Nim/issues/15896 https://github.com/nim-lang/Nim/issues/16416