From 8c4f59ab6b2486b0ddec0f80a45a084c2db951d2 Mon Sep 17 00:00:00 2001 From: Andrii Riabushenko Date: Tue, 24 Dec 2019 18:06:48 +0000 Subject: [PATCH] fixes #12945 --- compiler/semexprs.nim | 12 ++++++------ tests/iter/tmoditer.nim | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index ce0f10298381b..3662b397c398c 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1789,12 +1789,12 @@ proc semYieldVarResult(c: PContext, n: PNode, restype: PType) = let e = skipTypes(t[i], {tyGenericInst, tyAlias, tySink}) if e.kind in {tyVar, tyLent}: e.flags.incl tfVarIsPtr # bugfix for #4048, #4910, #6892 - if n[0].kind in {nkPar, nkTupleConstr}: - n[0][i] = takeImplicitAddr(c, n[0][i], e.kind == tyLent) - elif n[0].kind in {nkHiddenStdConv, nkHiddenSubConv} and - n[0][1].kind in {nkPar, nkTupleConstr}: - var a = n[0][1] - a[i] = takeImplicitAddr(c, a[i], e.kind == tyLent) + let tupleConstr = if n[0].kind in {nkHiddenStdConv, nkHiddenSubConv}: n[0][1] else: n[0] + if tupleConstr.kind in {nkPar, nkTupleConstr}: + if tupleConstr[i].kind == nkExprColonExpr: + tupleConstr[i][1] = takeImplicitAddr(c, tupleConstr[i][1], e.kind == tyLent) + else: + tupleConstr[i] = takeImplicitAddr(c, tupleConstr[i], e.kind == tyLent) else: localError(c.config, n[0].info, errXExpected, "tuple constructor") else: discard diff --git a/tests/iter/tmoditer.nim b/tests/iter/tmoditer.nim index 34c6321ce38e7..b92a416fbc67a 100644 --- a/tests/iter/tmoditer.nim +++ b/tests/iter/tmoditer.nim @@ -4,7 +4,7 @@ discard """ iterator modPairs(a: var array[0..4,string]): tuple[key: int, val: var string] = for i in 0..a.high: - yield (i, a[i]) + yield (key: i, val: a[i]) iterator modItems*[T](a: var array[0..4,T]): var T = for i in 0..a.high: @@ -49,7 +49,7 @@ iterator lentItems[T](a: openarray[T]): lent T = iterator lentPairs[T](a: array[0..1, T]): tuple[key: int, val: lent T] = for i in 0..a.high: - yield (i, a[i]) + yield (key: i, val: a[i]) let arr1 = [1, 2, 3]