summary refs log tree commit diff stats
path: root/compiler/vmgen.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2014-02-17 08:26:44 +0100
committerAraq <rumpf_a@web.de>2014-02-17 08:26:44 +0100
commit3ec29738757c4b8eb0a7071333a0351d802e30a6 (patch)
tree89779c41bbb74827d296153217d4a6aee628a68b /compiler/vmgen.nim
parent350a49cc26803bc38a3c83d469f8deaeecf0f112 (diff)
downloadNim-3ec29738757c4b8eb0a7071333a0351d802e30a6.tar.gz
fixes #926
Diffstat (limited to 'compiler/vmgen.nim')
-rw-r--r--compiler/vmgen.nim19
1 files changed, 12 insertions, 7 deletions
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim
index 6fca7f907..80cf4a9bf 100644
--- a/compiler/vmgen.nim
+++ b/compiler/vmgen.nim
@@ -916,23 +916,28 @@ proc requiresCopy(n: PNode): bool =
 proc unneededIndirection(n: PNode): bool =
   n.typ.skipTypes(abstractInst-{tyTypeDesc}).kind == tyRef
 
-proc skipDeref(n: PNode): PNode =
-  if n.kind in {nkDerefExpr, nkHiddenDeref} and unneededIndirection(n.sons[0]):
-    result = n.sons[0]
-  else:
-    result = n
-
 proc genAddrDeref(c: PCtx; n: PNode; dest: var TDest; opc: TOpcode;
                   flags: TGenFlags) = 
   # a nop for certain types
   let flags = if opc == opcAddr: flags+{gfAddrOf} else: flags
-  if unneededIndirection(n.sons[0]):
+  # consider:
+  # proc foo(f: var ref int) =
+  #   f = new(int)
+  # proc blah() =
+  #   var x: ref int
+  #   foo x
+  #
+  # The type of 'f' is 'var ref int' and of 'x' is 'ref int'. Hence for
+  # nkAddr we must not use 'unneededIndirection', but for deref we use it.
+  if opc != opcAddr and unneededIndirection(n.sons[0]):
     gen(c, n.sons[0], dest, flags)
+    message(n.info, warnUser, "YES")
   else:
     let tmp = c.genx(n.sons[0], flags)
     if dest < 0: dest = c.getTemp(n.typ)
     gABC(c, n, opc, dest, tmp)
     c.freeTemp(tmp)
+    message(n.info, warnUser, "NO")
 
 proc whichAsgnOpc(n: PNode): TOpcode =
   case n.typ.skipTypes(abstractRange-{tyTypeDesc}).kind