@@ -916,23 +916,28 @@ proc requiresCopy(n: PNode): bool =
916916proc 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-
925919proc 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
937942proc whichAsgnOpc (n: PNode ): TOpcode =
938943 case n.typ.skipTypes (abstractRange- {tyTypeDesc}).kind
0 commit comments