This commit is contained in:
Araq 2015-01-11 13:51:30 +01:00
commit 9d0ae03918
4 changed files with 30 additions and 7 deletions

View file

@ -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)

View file

@ -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

View file

@ -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

View 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)]