summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorcooldome <cdome@bk.ru>2018-11-27 17:59:21 +0000
committerAndreas Rumpf <rumpf_a@web.de>2018-11-27 18:59:21 +0100
commit5b98afb8a8120b697fac625fd691f3484c328b23 (patch)
tree29992c059fbcd980ec6f04c1ff933ab76284f7bc
parentcc0364e72f14531466eec367f10f72e4bcd9168e (diff)
downloadNim-5b98afb8a8120b697fac625fd691f3484c328b23.tar.gz
Destructors: more moves for tuples (#9808)
-rw-r--r--compiler/destroyer.nim5
-rw-r--r--compiler/lowerings.nim2
-rw-r--r--compiler/sem.nim2
-rw-r--r--tests/destructor/tmove_objconstr.nim8
4 files changed, 13 insertions, 4 deletions
diff --git a/compiler/destroyer.nim b/compiler/destroyer.nim
index c515ba1d4..2d21a6019 100644
--- a/compiler/destroyer.nim
+++ b/compiler/destroyer.nim
@@ -458,6 +458,11 @@ proc moveOrCopy(dest, ri: PNode; c: var Con): PNode =
     else:
       result = genCopy(c, dest.typ, dest, ri)
     result.add p(ri, c)
+  of nkStmtListExpr:
+    result = newNodeI(nkStmtList, ri.info)
+    for i in 0..ri.len-2:
+      result.add p(ri[i], c)
+    result.add moveOrCopy(dest, ri[^1], c)
   of nkObjConstr:
     result = genSink(c, dest.typ, dest, ri)
     let ri2 = copyTree(ri)
diff --git a/compiler/lowerings.nim b/compiler/lowerings.nim
index 603def326..d199abcc7 100644
--- a/compiler/lowerings.nim
+++ b/compiler/lowerings.nim
@@ -78,7 +78,7 @@ proc lowerTupleUnpackingForAsgn*(g: ModuleGraph; n: PNode; owner: PSym): PNode =
   let value = n.lastSon
   result = newNodeI(nkStmtList, n.info)
 
-  var temp = newSym(skLet, getIdent(g.cache, "_"), owner, value.info, owner.options)
+  var temp = newSym(skTemp, getIdent(g.cache, "_"), owner, value.info, owner.options)
   var v = newNodeI(nkLetSection, value.info)
   let tempAsNode = newSymNode(temp) #newIdentNode(getIdent(genPrefix & $temp.id), value.info)
 
diff --git a/compiler/sem.nim b/compiler/sem.nim
index 775c9f7c9..924e53b66 100644
--- a/compiler/sem.nim
+++ b/compiler/sem.nim
@@ -204,7 +204,7 @@ proc newSymG*(kind: TSymKind, n: PNode, c: PContext): PSym =
   if n.kind == nkSym:
     # and sfGenSym in n.sym.flags:
     result = n.sym
-    if result.kind != kind:
+    if result.kind notin {kind, skTemp}:
       localError(c.config, n.info, "cannot use symbol of kind '" &
                  $result.kind & "' as a '" & $kind & "'")
     if sfGenSym in result.flags and result.kind notin {skTemplate, skMacro, skParam}:
diff --git a/tests/destructor/tmove_objconstr.nim b/tests/destructor/tmove_objconstr.nim
index c6be2e7e3..26cc682b5 100644
--- a/tests/destructor/tmove_objconstr.nim
+++ b/tests/destructor/tmove_objconstr.nim
@@ -108,7 +108,8 @@ proc myfunc(x, y: int): (MySeqNonCopyable, MySeqNonCopyable) =
   result = (newMySeq(x, 1.0), newMySeq(y, 5.0))
 
 proc myfunc2(x, y: int): tuple[a: MySeqNonCopyable, b:int, c:MySeqNonCopyable] =
-  (a: newMySeq(x, 1.0), b:0, c:newMySeq(y, 5.0))
+  var cc = newMySeq(y, 5.0)
+  (a: newMySeq(x, 1.0), b:0, c: cc)
 
 let (seq1, seq2) = myfunc(2, 3)
 doAssert seq1.len == 2
@@ -118,4 +119,7 @@ doAssert seq2[0] == 5.0
 
 var (seq3, i, _) = myfunc2(2, 3)
 doAssert seq3.len == 2
-doAssert seq3[0] == 1.0
\ No newline at end of file
+doAssert seq3[0] == 1.0
+
+var seq4, seq5: MySeqNonCopyable
+(seq4, i, seq5) = myfunc2(2, 3)
\ No newline at end of file