diff options
-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 |