New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
iterator with inner procs produces internal error: inconsistent environment type
#21242
Comments
The following will also produce the same result. iterator iterSome(): int =
let something = 6
proc inner1() =
let othersomething = something
inner1()
for n in 0 .. 10:
inner1()
yield n
proc test() =
proc test1() =
for v in iterSome():
discard
test1()
test() |
Is there anything I can do to contribute to a solution for this issue? I do not know enough about Nim's compiler internals so I'd need some pointers. Still happens with:
|
Look into compiler/lambdalifting.nim |
!nim c iterator iterSome(): int =
proc inner1() =
let something = 6
proc inner2() =
let othersomething = something
inner2()
for n in 0 .. 1:
inner1()
yield n
proc test() =
proc test1() =
for v in iterSome(): discard
test1()
test() |
@juancarlospaco (contributor) devel :-1: FAILOutput
Stats
IRASTnnkStmtList.newTree(
nnkIteratorDef.newTree(
newIdentNode("iterSome"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newIdentNode("int")
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("inner1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("something"),
newEmptyNode(),
newLit(6)
)
),
nnkProcDef.newTree(
newIdentNode("inner2"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("othersomething"),
newEmptyNode(),
newIdentNode("something")
)
)
)
),
nnkCall.newTree(
newIdentNode("inner2")
)
)
),
nnkForStmt.newTree(
newIdentNode("n"),
nnkInfix.newTree(
newIdentNode(".."),
newLit(0),
newLit(1)
),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("inner1")
),
nnkYieldStmt.newTree(
newIdentNode("n")
)
)
)
)
),
nnkProcDef.newTree(
newIdentNode("test"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("test1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkForStmt.newTree(
newIdentNode("v"),
nnkCall.newTree(
newIdentNode("iterSome")
),
nnkStmtList.newTree(
nnkDiscardStmt.newTree(
newEmptyNode()
)
)
)
)
),
nnkCall.newTree(
newIdentNode("test1")
)
)
),
nnkCall.newTree(
newIdentNode("test")
)
) stable :-1: FAILOutput
Stats
IRASTnnkStmtList.newTree(
nnkIteratorDef.newTree(
newIdentNode("iterSome"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newIdentNode("int")
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("inner1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("something"),
newEmptyNode(),
newLit(6)
)
),
nnkProcDef.newTree(
newIdentNode("inner2"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("othersomething"),
newEmptyNode(),
newIdentNode("something")
)
)
)
),
nnkCall.newTree(
newIdentNode("inner2")
)
)
),
nnkForStmt.newTree(
newIdentNode("n"),
nnkInfix.newTree(
newIdentNode(".."),
newLit(0),
newLit(1)
),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("inner1")
),
nnkYieldStmt.newTree(
newIdentNode("n")
)
)
)
)
),
nnkProcDef.newTree(
newIdentNode("test"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("test1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkForStmt.newTree(
newIdentNode("v"),
nnkCall.newTree(
newIdentNode("iterSome")
),
nnkStmtList.newTree(
nnkDiscardStmt.newTree(
newEmptyNode()
)
)
)
)
),
nnkCall.newTree(
newIdentNode("test1")
)
)
),
nnkCall.newTree(
newIdentNode("test")
)
) 1.6.0 :-1: FAILOutput
Stats
IRASTnnkStmtList.newTree(
nnkIteratorDef.newTree(
newIdentNode("iterSome"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newIdentNode("int")
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("inner1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("something"),
newEmptyNode(),
newLit(6)
)
),
nnkProcDef.newTree(
newIdentNode("inner2"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("othersomething"),
newEmptyNode(),
newIdentNode("something")
)
)
)
),
nnkCall.newTree(
newIdentNode("inner2")
)
)
),
nnkForStmt.newTree(
newIdentNode("n"),
nnkInfix.newTree(
newIdentNode(".."),
newLit(0),
newLit(1)
),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("inner1")
),
nnkYieldStmt.newTree(
newIdentNode("n")
)
)
)
)
),
nnkProcDef.newTree(
newIdentNode("test"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("test1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkForStmt.newTree(
newIdentNode("v"),
nnkCall.newTree(
newIdentNode("iterSome")
),
nnkStmtList.newTree(
nnkDiscardStmt.newTree(
newEmptyNode()
)
)
)
)
),
nnkCall.newTree(
newIdentNode("test1")
)
)
),
nnkCall.newTree(
newIdentNode("test")
)
) 1.4.0 :-1: FAILOutput
Stats
IRASTnnkStmtList.newTree(
nnkIteratorDef.newTree(
newIdentNode("iterSome"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newIdentNode("int")
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("inner1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("something"),
newEmptyNode(),
newLit(6)
)
),
nnkProcDef.newTree(
newIdentNode("inner2"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("othersomething"),
newEmptyNode(),
newIdentNode("something")
)
)
)
),
nnkCall.newTree(
newIdentNode("inner2")
)
)
),
nnkForStmt.newTree(
newIdentNode("n"),
nnkInfix.newTree(
newIdentNode(".."),
newLit(0),
newLit(1)
),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("inner1")
),
nnkYieldStmt.newTree(
newIdentNode("n")
)
)
)
)
),
nnkProcDef.newTree(
newIdentNode("test"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("test1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkForStmt.newTree(
newIdentNode("v"),
nnkCall.newTree(
newIdentNode("iterSome")
),
nnkStmtList.newTree(
nnkDiscardStmt.newTree(
newEmptyNode()
)
)
)
)
),
nnkCall.newTree(
newIdentNode("test1")
)
)
),
nnkCall.newTree(
newIdentNode("test")
)
) 1.2.0 :-1: FAILOutput
Stats
IRASTnnkStmtList.newTree(
nnkIteratorDef.newTree(
newIdentNode("iterSome"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newIdentNode("int")
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("inner1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("something"),
newEmptyNode(),
newLit(6)
)
),
nnkProcDef.newTree(
newIdentNode("inner2"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("othersomething"),
newEmptyNode(),
newIdentNode("something")
)
)
)
),
nnkCall.newTree(
newIdentNode("inner2")
)
)
),
nnkForStmt.newTree(
newIdentNode("n"),
nnkInfix.newTree(
newIdentNode(".."),
newLit(0),
newLit(1)
),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("inner1")
),
nnkYieldStmt.newTree(
newIdentNode("n")
)
)
)
)
),
nnkProcDef.newTree(
newIdentNode("test"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("test1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkForStmt.newTree(
newIdentNode("v"),
nnkCall.newTree(
newIdentNode("iterSome")
),
nnkStmtList.newTree(
nnkDiscardStmt.newTree(
newEmptyNode()
)
)
)
)
),
nnkCall.newTree(
newIdentNode("test1")
)
)
),
nnkCall.newTree(
newIdentNode("test")
)
) 1.0.0 :-1: FAILOutput
Stats
IRASTnnkStmtList.newTree(
nnkIteratorDef.newTree(
newIdentNode("iterSome"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newIdentNode("int")
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("inner1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("something"),
newEmptyNode(),
newLit(6)
)
),
nnkProcDef.newTree(
newIdentNode("inner2"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("othersomething"),
newEmptyNode(),
newIdentNode("something")
)
)
)
),
nnkCall.newTree(
newIdentNode("inner2")
)
)
),
nnkForStmt.newTree(
newIdentNode("n"),
nnkInfix.newTree(
newIdentNode(".."),
newLit(0),
newLit(1)
),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("inner1")
),
nnkYieldStmt.newTree(
newIdentNode("n")
)
)
)
)
),
nnkProcDef.newTree(
newIdentNode("test"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("test1"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode()
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkForStmt.newTree(
newIdentNode("v"),
nnkCall.newTree(
newIdentNode("iterSome")
),
nnkStmtList.newTree(
nnkDiscardStmt.newTree(
newEmptyNode()
)
)
)
)
),
nnkCall.newTree(
newIdentNode("test1")
)
)
),
nnkCall.newTree(
newIdentNode("test")
)
) 39 minutes bisecting 6 commits at 0 commits per second.
|
Thank you @Araq. I guess I should have been more specific when I asked for pointers. I had found where the error came from ( I see the environment for If I comment out the |
It can be that easy. However! We need to investigate why var cp = getEnvParam(fn)
let owner = if fn.kind == skIterator: fn else: fn.skipGenericOwner
let t = c.getEnvTypeForOwner(owner, info)
|
FYI at the point where the error is emitted
Different |
Seems like it. |
Digging a bit more I found the following:
Note that
|
Description
The following code will trigger the issue.
Nim Version
and
Current Output
Expected Output
Possible Solution
No response
Additional Information
I believe I encountered this issue a few times in the last month or so but only found time now to distill a minimal test case to reproduce it. In this instance the issue appeared when using
npeg
(https://github.com/zevv/npeg) in an iterator like so:I could not find an existing issue matching what I am seeing.
The text was updated successfully, but these errors were encountered: