diff options
author | Araq <rumpf_a@web.de> | 2014-02-17 08:26:44 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-02-17 08:26:44 +0100 |
commit | 3ec29738757c4b8eb0a7071333a0351d802e30a6 (patch) | |
tree | 89779c41bbb74827d296153217d4a6aee628a68b /compiler/vmgen.nim | |
parent | 350a49cc26803bc38a3c83d469f8deaeecf0f112 (diff) | |
download | Nim-3ec29738757c4b8eb0a7071333a0351d802e30a6.tar.gz |
fixes #926
Diffstat (limited to 'compiler/vmgen.nim')
-rw-r--r-- | compiler/vmgen.nim | 19 |
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 |