Skip to content

Commit 2f24475

Browse files
committed
fixes #926
1 parent 2f06970 commit 2f24475

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

compiler/vmgen.nim

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -916,23 +916,28 @@ proc requiresCopy(n: PNode): bool =
916916
proc unneededIndirection(n: PNode): bool =
917917
n.typ.skipTypes(abstractInst-{tyTypeDesc}).kind == tyRef
918918

919-
proc skipDeref(n: PNode): PNode =
920-
if n.kind in {nkDerefExpr, nkHiddenDeref} and unneededIndirection(n.sons[0]):
921-
result = n.sons[0]
922-
else:
923-
result = n
924-
925919
proc genAddrDeref(c: PCtx; n: PNode; dest: var TDest; opc: TOpcode;
926920
flags: TGenFlags) =
927921
# a nop for certain types
928922
let flags = if opc == opcAddr: flags+{gfAddrOf} else: flags
929-
if unneededIndirection(n.sons[0]):
923+
# consider:
924+
# proc foo(f: var ref int) =
925+
# f = new(int)
926+
# proc blah() =
927+
# var x: ref int
928+
# foo x
929+
#
930+
# The type of 'f' is 'var ref int' and of 'x' is 'ref int'. Hence for
931+
# nkAddr we must not use 'unneededIndirection', but for deref we use it.
932+
if opc != opcAddr and unneededIndirection(n.sons[0]):
930933
gen(c, n.sons[0], dest, flags)
934+
message(n.info, warnUser, "YES")
931935
else:
932936
let tmp = c.genx(n.sons[0], flags)
933937
if dest < 0: dest = c.getTemp(n.typ)
934938
gABC(c, n, opc, dest, tmp)
935939
c.freeTemp(tmp)
940+
message(n.info, warnUser, "NO")
936941

937942
proc whichAsgnOpc(n: PNode): TOpcode =
938943
case n.typ.skipTypes(abstractRange-{tyTypeDesc}).kind

tests/macros/tvarnimnode.nim

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
discard """
2+
output: 10
3+
"""
4+
5+
#bug #926
6+
7+
import macros
8+
9+
proc test(f: var PNimrodNode) {.compileTime.} =
10+
f = newNimNode(nnkStmtList)
11+
f.add newCall(newIdentNode("echo"), newLit(10))
12+
13+
macro blah(prc: stmt): stmt =
14+
result = prc
15+
16+
test(result)
17+
18+
proc test() {.blah.} =
19+
echo 5

0 commit comments

Comments
 (0)