summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorcooldome <cdome@bk.ru>2019-12-31 20:13:26 +0000
committerAndreas Rumpf <rumpf_a@web.de>2019-12-31 21:13:26 +0100
commit584e8c8283b3936046e6cb82044e06352976482f (patch)
tree0a09e0a97a8b4b3bfe13f8b1f60133c15873df62 /compiler
parentce40ed18bb648a1ed1b78e37a07cc749ec3ab27e (diff)
downloadNim-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.nim18
-rw-r--r--compiler/lowerings.nim1
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)