summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2020-07-08 14:47:14 +0200
committerGitHub <noreply@github.com>2020-07-08 14:47:14 +0200
commit06d776a5828d429f62c3189a99161604d50f9b96 (patch)
treeceacd12e5c00b8573ddd4d23e58a0f927c30a6ab
parentcb1ecbf95620bffd559610b70f99c6f16963ac5c (diff)
downloadNim-06d776a5828d429f62c3189a99161604d50f9b96.tar.gz
fixes #14900, this time for real, maybe (#14934)
-rw-r--r--compiler/injectdestructors.nim10
-rw-r--r--tests/arc/tcontrolflow.nim28
2 files changed, 19 insertions, 19 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim
index 67d61525e..b5e1db169 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 27ae45257..41f614cb2 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
-
-echo seqsEqual(@["a", "b", "c"], @["a", "b", "c"])
+
+proc seqsEqual(a, b: string): bool =
+  if false:
+    false
+  else:
+    (var result1 = a; result1) == (var result2 = b; result2)
+
+# can be const or var too
+let expected = "hello"
+
+echo seqsEqual(expected, expected)