diff options
-rw-r--r-- | compiler/ccgcalls.nim | 4 | ||||
-rw-r--r-- | tests/ccgbugs/tret_arg_init.nim | 26 |
2 files changed, 28 insertions, 2 deletions
diff --git a/compiler/ccgcalls.nim b/compiler/ccgcalls.nim index 772a208cb..8ea81ac65 100644 --- a/compiler/ccgcalls.nim +++ b/compiler/ccgcalls.nim @@ -30,7 +30,7 @@ proc fixupCall(p: BProc, le, ri: PNode, d: var TLoc, if d.k in {locTemp, locNone} or not leftAppearsOnRightSide(le, ri): # Great, we can use 'd': if d.k == locNone: getTemp(p, typ.sons[0], d, needsInit=true) - elif d.k notin {locExpr, locTemp} and not hasNoInit(ri): + elif d.k notin {locTemp} and not hasNoInit(ri): # reset before pass as 'result' var: resetLoc(p, d) add(pl, addrLoc(d)) @@ -226,7 +226,7 @@ proc genClosureCall(p: BProc, le, ri: PNode, d: var TLoc) = # Great, we can use 'd': if d.k == locNone: getTemp(p, typ.sons[0], d, needsInit=true) - elif d.k notin {locExpr, locTemp} and not hasNoInit(ri): + elif d.k notin {locTemp} and not hasNoInit(ri): # reset before pass as 'result' var: resetLoc(p, d) add(pl, addrLoc(d)) diff --git a/tests/ccgbugs/tret_arg_init.nim b/tests/ccgbugs/tret_arg_init.nim new file mode 100644 index 000000000..3c80fb061 --- /dev/null +++ b/tests/ccgbugs/tret_arg_init.nim @@ -0,0 +1,26 @@ +discard """ + output: '''nil +nil +nil''' +""" + +type Bar = object + s1, s2: string + +proc initBar(): Bar = discard + +var a: array[5, Bar] +a[0].s1 = "hey" +a[0] = initBar() +echo a[0].s1 + +type Foo = object + b: Bar +var f: Foo +f.b.s1 = "hi" +f.b = initBar() +echo f.b.s1 + +var ad = addr f.b +ad[] = initBar() +echo ad[].s1 |