summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/ccgcalls.nim4
-rw-r--r--tests/ccgbugs/tret_arg_init.nim26
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