diff options
author | cooldome <cdome@bk.ru> | 2018-11-27 17:59:21 +0000 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-11-27 18:59:21 +0100 |
commit | 5b98afb8a8120b697fac625fd691f3484c328b23 (patch) | |
tree | 29992c059fbcd980ec6f04c1ff933ab76284f7bc | |
parent | cc0364e72f14531466eec367f10f72e4bcd9168e (diff) | |
download | Nim-5b98afb8a8120b697fac625fd691f3484c328b23.tar.gz |
Destructors: more moves for tuples (#9808)
-rw-r--r-- | compiler/destroyer.nim | 5 | ||||
-rw-r--r-- | compiler/lowerings.nim | 2 | ||||
-rw-r--r-- | compiler/sem.nim | 2 | ||||
-rw-r--r-- | tests/destructor/tmove_objconstr.nim | 8 |
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 |