From 06d776a5828d429f62c3189a99161604d50f9b96 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Wed, 8 Jul 2020 14:47:14 +0200 Subject: [PATCH] fixes #14900, this time for real, maybe (#14934) --- compiler/injectdestructors.nim | 10 ++++++++-- tests/arc/tcontrolflow.nim | 24 +++++++++--------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 67d61525e7..b5e1db1695 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -134,7 +134,7 @@ proc toTree(c: var Con; s: var Scope; ret: PNode; flags: set[ToTreeFlag]): PNode var r = PNode(nil) if isExpr: result = newNodeIT(nkStmtListExpr, ret.info, ret.typ) - if ret.kind == nkStmtListExpr: + if ret.kind in nkCallKinds + {nkStmtListExpr}: r = getTemp(c, s, ret.typ, ret.info) else: result = newNodeI(nkStmtList, ret.info) @@ -155,7 +155,13 @@ proc toTree(c: var Con; s: var Scope; ret: PNode; flags: set[ToTreeFlag]): PNode result.add newTryFinally(ret, finSection) else: if r != nil: - result.add newTree(nkFastAsgn, r, ret) + if ret.kind == nkStmtListExpr: + # simplify it a bit further by merging the nkStmtListExprs + let last = ret.len - 1 + for i in 0 ..< last: result.add ret[i] + result.add newTree(nkFastAsgn, r, ret[last]) + else: + result.add newTree(nkFastAsgn, r, ret) else: result.add ret for m in s.wasMoved: result.add m diff --git a/tests/arc/tcontrolflow.nim b/tests/arc/tcontrolflow.nim index 27ae452579..41f614cb20 100644 --- a/tests/arc/tcontrolflow.nim +++ b/tests/arc/tcontrolflow.nim @@ -105,20 +105,14 @@ proc escapeCheck = escapeCheck() # bug #14900 -template sortedByIt(seq1): untyped = - var result = seq1 - result -proc seqsEqual(seq1, seq2: seq[string]): bool = - # works as a normal proc (if we would assign result inside) - # doesn't work as an expression - result = if false: # needed - false - else: - let a1 = seq1.sortedByIt() - let a2 = seq2.sortedByIt() - # echo a1 - works if you uncomment any of these - # echo a2 - a1 == a2 +proc seqsEqual(a, b: string): bool = + if false: + false + else: + (var result1 = a; result1) == (var result2 = b; result2) -echo seqsEqual(@["a", "b", "c"], @["a", "b", "c"]) +# can be const or var too +let expected = "hello" + +echo seqsEqual(expected, expected)