From a5f02cac85281fc2804e910f330f0c11d3c4f77b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20D=C3=B6ring?= Date: Sun, 22 Mar 2020 20:03:51 +0100 Subject: [PATCH] fix #13417 (#13712) * fix #13417 * add test --- compiler/transf.nim | 21 ++++++++++----------- tests/iter/titer_issues.nim | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/compiler/transf.nim b/compiler/transf.nim index c1af6c23f419..2bd64804e41e 100644 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -554,14 +554,14 @@ 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 @@ -569,14 +569,14 @@ proc putArgInto(arg: PNode, formal: PType): TPutArgInto = result = putArgInto(arg[0], formal) of nkCurly, nkBracket: for i in 0..= ff.n.len: return result @@ -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) diff --git a/tests/iter/titer_issues.nim b/tests/iter/titer_issues.nim index a7830dfabdfa..b8a117e59d8d 100644 --- a/tests/iter/titer_issues.nim +++ b/tests/iter/titer_issues.nim @@ -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