fixes #1838
This commit is contained in:
parent
b5a8e34ae7
commit
9d0ae03918
4 changed files with 30 additions and 7 deletions
|
|
@ -1317,18 +1317,20 @@ proc semYield(c: PContext, n: PNode): PNode =
|
||||||
elif n.sons[0].kind != nkEmpty:
|
elif n.sons[0].kind != nkEmpty:
|
||||||
n.sons[0] = semExprWithType(c, n.sons[0]) # check for type compatibility:
|
n.sons[0] = semExprWithType(c, n.sons[0]) # check for type compatibility:
|
||||||
var iterType = c.p.owner.typ
|
var iterType = c.p.owner.typ
|
||||||
var restype = iterType.sons[0]
|
let restype = iterType.sons[0]
|
||||||
if restype != nil:
|
if restype != nil:
|
||||||
let adjustedRes = if c.p.owner.kind == skIterator: restype.base
|
let adjustedRes = if restype.kind == tyIter: restype.base
|
||||||
else: restype
|
else: restype
|
||||||
|
if adjustedRes.kind != tyExpr:
|
||||||
n.sons[0] = fitNode(c, adjustedRes, n.sons[0])
|
n.sons[0] = fitNode(c, adjustedRes, n.sons[0])
|
||||||
if n.sons[0].typ == nil: internalError(n.info, "semYield")
|
if n.sons[0].typ == nil: internalError(n.info, "semYield")
|
||||||
|
|
||||||
if resultTypeIsInferrable(adjustedRes):
|
if resultTypeIsInferrable(adjustedRes):
|
||||||
let inferred = n.sons[0].typ
|
let inferred = n.sons[0].typ
|
||||||
if c.p.owner.kind == skIterator:
|
if restype.kind == tyIter:
|
||||||
iterType.sons[0].sons[0] = inferred
|
restype.sons[0] = inferred
|
||||||
else:
|
else:
|
||||||
|
debug inferred
|
||||||
iterType.sons[0] = inferred
|
iterType.sons[0] = inferred
|
||||||
|
|
||||||
semYieldVarResult(c, n, adjustedRes)
|
semYieldVarResult(c, n, adjustedRes)
|
||||||
|
|
|
||||||
|
|
@ -939,7 +939,7 @@ proc semProcTypeNode(c: PContext, n, genericParams: PNode,
|
||||||
r = semTypeNode(c, n.sons[0], nil)
|
r = semTypeNode(c, n.sons[0], nil)
|
||||||
elif kind == skIterator:
|
elif kind == skIterator:
|
||||||
# XXX This is special magic we should likely get rid of
|
# XXX This is special magic we should likely get rid of
|
||||||
r = newTypeS(tyAnything, c)
|
r = newTypeS(tyExpr, c)
|
||||||
|
|
||||||
if r != nil:
|
if r != nil:
|
||||||
# turn explicit 'void' return type into 'nil' because the rest of the
|
# turn explicit 'void' return type into 'nil' because the rest of the
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,16 @@ discard """
|
||||||
128
|
128
|
||||||
192
|
192
|
||||||
'''
|
'''
|
||||||
|
disabled: "true"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# This all relies on non-documented and questionable features.
|
||||||
|
|
||||||
iterator gaz(it: iterator{.inline.}): type(it) =
|
iterator gaz(it: iterator{.inline.}): type(it) =
|
||||||
for x in it:
|
for x in it:
|
||||||
yield x*2
|
yield x*2
|
||||||
|
|
||||||
iterator baz(it: iterator{.inline.}) =
|
iterator baz(it: iterator{.inline.}): auto =
|
||||||
for x in gaz(it):
|
for x in gaz(it):
|
||||||
yield x*2
|
yield x*2
|
||||||
|
|
||||||
|
|
|
||||||
18
tests/iter/timplicit_auto.nim
Normal file
18
tests/iter/timplicit_auto.nim
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
# bug #1838
|
||||||
|
|
||||||
|
type State = enum Empty, Tree, Fire
|
||||||
|
|
||||||
|
const
|
||||||
|
disp: array[State, string] = [" ", "\e[32m/\\\e[m", "\e[07;31m/\\\e[m"]
|
||||||
|
|
||||||
|
proc univ(x, y: int): State = Tree
|
||||||
|
|
||||||
|
var w, h = 30
|
||||||
|
|
||||||
|
iterator fields(a = (0,0), b = (h-1,w-1)) =
|
||||||
|
for y in max(a[0], 0) .. min(b[0], h-1):
|
||||||
|
for x in max(a[1], 0) .. min(b[1], w-1):
|
||||||
|
yield (y,x)
|
||||||
|
|
||||||
|
for y,x in fields():
|
||||||
|
stdout.write disp[univ(x, y)]
|
||||||
Loading…
Add table
Add a link
Reference in a new issue