Iterator fixes (#11234)
This commit is contained in:
parent
fb1c3a95a5
commit
6fc74cec55
8 changed files with 142 additions and 17 deletions
72
tests/iter/titer13.nim
Normal file
72
tests/iter/titer13.nim
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
discard """
|
||||
output: '''b yields
|
||||
c yields
|
||||
a returns
|
||||
b yields
|
||||
b returns
|
||||
c yields
|
||||
|
||||
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
'''
|
||||
"""
|
||||
|
||||
block:
|
||||
template tloop(iter: untyped) =
|
||||
for i in iter():
|
||||
echo i
|
||||
|
||||
template twhile(iter: untyped) =
|
||||
let it = iter
|
||||
while not finished(it):
|
||||
echo it()
|
||||
|
||||
iterator a(): auto {.closure.} =
|
||||
if true: return "a returns"
|
||||
yield "a yields"
|
||||
|
||||
iterator b(): auto {.closure.} =
|
||||
yield "b yields"
|
||||
if true: return "b returns"
|
||||
|
||||
iterator c(): auto {.closure.} =
|
||||
yield "c yields"
|
||||
if true: return
|
||||
|
||||
iterator d(): auto {.closure.} =
|
||||
if true: return
|
||||
yield "d yields"
|
||||
|
||||
tloop(a)
|
||||
tloop(b)
|
||||
tloop(c)
|
||||
tloop(d)
|
||||
twhile(a)
|
||||
twhile(b)
|
||||
twhile(c)
|
||||
twhile(d)
|
||||
|
||||
block:
|
||||
iterator a: auto =
|
||||
yield 1
|
||||
for x in a():
|
||||
echo x
|
||||
|
||||
let b = iterator: int =
|
||||
yield 2
|
||||
for x in b():
|
||||
echo x
|
||||
|
||||
let c = iterator: auto =
|
||||
yield 3
|
||||
for x in c():
|
||||
echo x
|
||||
|
||||
block:
|
||||
iterator myIter2(): auto {.closure.} =
|
||||
yield 4
|
||||
for a in myIter2():
|
||||
echo a
|
||||
8
tests/iter/titerassignerr.nim
Normal file
8
tests/iter/titerassignerr.nim
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
discard """
|
||||
errormsg: "inline iterators are not first-class / cannot be assigned to variables"
|
||||
line: 8
|
||||
"""
|
||||
|
||||
iterator foo: int =
|
||||
yield 2
|
||||
let x = foo
|
||||
8
tests/iter/titerautoerr1.nim
Normal file
8
tests/iter/titerautoerr1.nim
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
discard """
|
||||
errormsg: "type mismatch: got <int literal(1)> but expected 'string'"
|
||||
line: 8
|
||||
"""
|
||||
|
||||
iterator a(): auto {.closure.} =
|
||||
if true: return "str"
|
||||
yield 1
|
||||
8
tests/iter/titerautoerr2.nim
Normal file
8
tests/iter/titerautoerr2.nim
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
discard """
|
||||
errormsg: "type mismatch: got <string> but expected 'int literal(1)'"
|
||||
line: 8
|
||||
"""
|
||||
|
||||
iterator b(): auto {.closure.} =
|
||||
yield 1
|
||||
if true: return "str"
|
||||
9
tests/iter/titerautoerr3.nim
Normal file
9
tests/iter/titerautoerr3.nim
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
discard """
|
||||
errormsg: "cannot infer the return type of 'bar'"
|
||||
line: 6
|
||||
"""
|
||||
|
||||
iterator bar(): auto =
|
||||
discard
|
||||
for t in bar():
|
||||
discard
|
||||
Loading…
Add table
Add a link
Reference in a new issue