diff options
author | cooldome <cdome@bk.ru> | 2019-12-31 20:13:26 +0000 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-12-31 21:13:26 +0100 |
commit | 584e8c8283b3936046e6cb82044e06352976482f (patch) | |
tree | 0a09e0a97a8b4b3bfe13f8b1f60133c15873df62 /compiler | |
parent | ce40ed18bb648a1ed1b78e37a07cc749ec3ab27e (diff) | |
download | Nim-584e8c8283b3936046e6cb82044e06352976482f.tar.gz |
fixes #12989 (#12992)
* fixes #12989 * Revert "remove unwanted changes" This reverts commit 501829732a8e44deef2d815c303859efbe452cb5.
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/injectdestructors.nim | 18 | ||||
-rw-r--r-- | compiler/lowerings.nim | 1 |
2 files changed, 10 insertions, 9 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 0acf7fac2..d9a17cf7a 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -133,10 +133,10 @@ proc initialized(code: ControlFlowGraph; pc: int, inc pc return pc -template isUnpackedTuple(s: PSym): bool = +template isUnpackedTuple(n: PNode): bool = ## we move out all elements of unpacked tuples, ## hence unpacked tuples themselves don't need to be destroyed - s.kind == skTemp and s.typ.kind == tyTuple + (n.kind == nkSym and n.sym.kind == skTemp and n.sym.typ.kind == tyTuple) proc checkForErrorPragma(c: Con; t: PType; ri: PNode; opname: string) = var m = "'" & opname & "' is not available for type <" & typeToString(t) & ">" @@ -542,7 +542,7 @@ proc p(n: PNode; c: var Con; mode: ProcessMode): PNode = # move the variable declaration to the top of the frame: c.addTopVar v # make sure it's destroyed at the end of the proc: - if not isUnpackedTuple(it[0].sym): + if not isUnpackedTuple(v): c.destroys.add genDestroy(c, v) if ri.kind == nkEmpty and c.inLoop > 0: ri = genDefaultCall(v.typ, c, v.info) @@ -612,13 +612,15 @@ proc p(n: PNode; c: var Con; mode: ProcessMode): PNode = proc moveOrCopy(dest, ri: PNode; c: var Con): PNode = case ri.kind of nkCallKinds: - result = genSink(c, dest, ri) - result.add p(ri, c, consumed) - of nkBracketExpr: - if ri[0].kind == nkSym and isUnpackedTuple(ri[0].sym): - # unpacking of tuple: move out the elements + if isUnpackedTuple(dest): + result = newTree(nkFastAsgn, dest, p(ri, c, consumed)) + else: result = genSink(c, dest, ri) result.add p(ri, c, consumed) + of nkBracketExpr: + if isUnpackedTuple(ri[0]): + # unpacking of tuple: take over elements + result = newTree(nkFastAsgn, dest, p(ri, c, consumed)) elif isAnalysableFieldAccess(ri, c.owner) and isLastRead(ri, c): # Rule 3: `=sink`(x, z); wasMoved(z) var snk = genSink(c, dest, ri) diff --git a/compiler/lowerings.nim b/compiler/lowerings.nim index ac29d600b..cf8445820 100644 --- a/compiler/lowerings.nim +++ b/compiler/lowerings.nim @@ -60,7 +60,6 @@ proc lowerTupleUnpacking*(g: ModuleGraph; n: PNode; owner: PSym): PNode = var temp = newSym(skTemp, getIdent(g.cache, genPrefix), owner, value.info, g.config.options) temp.typ = skipTypes(value.typ, abstractInst) incl(temp.flags, sfFromGeneric) - incl(temp.flags, sfCursor) var v = newNodeI(nkVarSection, value.info) let tempAsNode = newSymNode(temp) |