diff options
-rw-r--r-- | compiler/ccgcalls.nim | 4 | ||||
-rw-r--r-- | compiler/cgen.nim | 1 | ||||
-rw-r--r-- | tests/ccgbugs/tcodegenbug1.nim | 31 |
3 files changed, 34 insertions, 2 deletions
diff --git a/compiler/ccgcalls.nim b/compiler/ccgcalls.nim index db2a9ddc9..18741732c 100644 --- a/compiler/ccgcalls.nim +++ b/compiler/ccgcalls.nim @@ -32,7 +32,7 @@ proc fixupCall(p: BProc, le, ri: PNode, d: var TLoc, if d.k == locNone: getTemp(p, typ.sons[0], d, needsInit=true) elif d.k notin {locTemp} and not hasNoInit(ri): # reset before pass as 'result' var: - resetLoc(p, d) + discard "resetLoc(p, d)" add(pl, addrLoc(d)) add(pl, ~");$n") line(p, cpsStmts, pl) @@ -228,7 +228,7 @@ proc genClosureCall(p: BProc, le, ri: PNode, d: var TLoc) = getTemp(p, typ.sons[0], d, needsInit=true) elif d.k notin {locTemp} and not hasNoInit(ri): # reset before pass as 'result' var: - resetLoc(p, d) + discard "resetLoc(p, d)" add(pl, addrLoc(d)) genCallPattern() else: diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 83c8501a4..ed9e4b7a4 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -726,6 +726,7 @@ proc genProcAux(m: BModule, prc: PSym) = else: fillResult(resNode) assignParam(p, res) + resetLoc(p, res.loc) if skipTypes(res.typ, abstractInst).kind == tyArray: #incl(res.loc.flags, lfIndirect) res.loc.storage = OnUnknown diff --git a/tests/ccgbugs/tcodegenbug1.nim b/tests/ccgbugs/tcodegenbug1.nim index 671974087..fce74de0c 100644 --- a/tests/ccgbugs/tcodegenbug1.nim +++ b/tests/ccgbugs/tcodegenbug1.nim @@ -1,3 +1,34 @@ +discard """ + output: '''obj = (inner: (kind: Just, id: 7)) +obj.inner.id = 7 +id = 7 +obj = (inner: (kind: Just, id: 7))''' +""" + +# bug #6960 + +import future +type + Kind = enum None, Just, Huge + Inner = object + case kind: Kind + of None: discard + of Just: id: int + of Huge: a,b,c,d,e,f: string + Outer = object + inner: Inner + + +proc shouldDoNothing(id: int): Inner = + dump id + Inner(kind: Just, id: id) + +var obj = Outer(inner: Inner(kind: Just, id: 7)) +dump obj +dump obj.inner.id +obj.inner = shouldDoNothing(obj.inner.id) +dump obj + import os type |