Skip to content

Commit

Permalink
fix #13417 (#13712)
Browse files Browse the repository at this point in the history
* fix #13417

* add test
  • Loading branch information
krux02 authored Mar 22, 2020
1 parent 64ffa17 commit a5f02ca
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 11 deletions.
21 changes: 10 additions & 11 deletions compiler/transf.nim
Original file line number Diff line number Diff line change
Expand Up @@ -554,29 +554,29 @@ proc putArgInto(arg: PNode, formal: PType): TPutArgInto =
# inline context.
if formal.kind == tyTypeDesc: return paDirectMapping
if skipTypes(formal, abstractInst).kind in {tyOpenArray, tyVarargs}:
case arg.kind
of nkStmtListExpr:
return paComplexOpenarray
case arg.skipHidden.kind
of nkBracket:
return paFastAsgnTakeTypeFromArg
of nkSym:
return paDirectMapping
else:
return paDirectMapping # XXX really correct?
# what if ``arg`` has side-effects?
return paComplexOpenarray

case arg.kind
of nkEmpty..nkNilLit:
result = paDirectMapping
of nkDotExpr, nkDerefExpr, nkHiddenDeref, nkAddr, nkHiddenAddr:
result = putArgInto(arg[0], formal)
of nkCurly, nkBracket:
for i in 0..<arg.len:
if putArgInto(arg[i], formal) != paDirectMapping:
if putArgInto(arg[i], formal) != paDirectMapping:
return paFastAsgn
result = paDirectMapping
of nkPar, nkTupleConstr, nkObjConstr:
for i in 0..<arg.len:
let a = if arg[i].kind == nkExprColonExpr: arg[i][1]
else: arg[0]
if putArgInto(a, formal) != paDirectMapping:
if putArgInto(a, formal) != paDirectMapping:
return paFastAsgn
result = paDirectMapping
else:
Expand Down Expand Up @@ -644,7 +644,7 @@ proc transformFor(c: PTransf, n: PNode): PNode =
# generate access statements for the parameters (unless they are constant)
pushTransCon(c, newC)
for i in 1..<call.len:
var arg = transform(c, call[i])
let arg = transform(c, call[i])
let ff = skipTypes(iter.typ, abstractInst)
# can happen for 'nim check':
if i >= ff.n.len: return result
Expand All @@ -671,9 +671,8 @@ proc transformFor(c: PTransf, n: PNode): PNode =
idNodeTablePut(newC.mapping, formal, arg)
# XXX BUG still not correct if the arg has a side effect!
of paComplexOpenarray:
let typ = newType(tySequence, formal.owner)
addSonSkipIntLit(typ, formal.typ[0])
var temp = newTemp(c, typ, formal.info)
# arrays will deep copy here (pretty bad).
var temp = newTemp(c, arg.typ, formal.info)
addVar(v, temp)
stmtList.add(newAsgnStmt(c, nkFastAsgn, temp, arg))
idNodeTablePut(newC.mapping, formal, temp)
Expand Down
21 changes: 21 additions & 0 deletions tests/iter/titer_issues.nim
Original file line number Diff line number Diff line change
Expand Up @@ -213,3 +213,24 @@ block t2023_objiter:

var o = init()
echo(o.iter())

block:
# bug #13417

var effectCounterP1 = 0

proc p1(): seq[int] =
inc effectCounterP1
@[1,2]

iterator ip1(v: openArray[int]): auto =
for x in v:
yield x

var effectCounterLoop = 0

for x in ip1(p1()):
inc effectCounterLoop

doAssert effectCounterP1 == 1
doAssert effectCounterLoop == 2

0 comments on commit a5f02ca

Please sign in to comment.