diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2020-02-07 06:58:57 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-07 06:58:57 +0100 |
commit | c87796180edc86cf3cc1fa0fb35f03c1461937cd (patch) | |
tree | c5a7195e99bfea2ccac9782750ac786d22ba0936 | |
parent | 7481f4375303f3bf41ec1d7f685283e558856531 (diff) | |
download | Nim-c87796180edc86cf3cc1fa0fb35f03c1461937cd.tar.gz |
fixes #13269 (#13344)
-rw-r--r-- | compiler/liftdestructors.nim | 9 | ||||
-rw-r--r-- | tests/arc/timportedobj.nim | 14 |
2 files changed, 20 insertions, 3 deletions
diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index 3671f62b8..377ba149a 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -93,8 +93,8 @@ proc fillBodyObj(c: var TLiftCtx; n, body, x, y: PNode; enforceDefaultOp: bool) # XXX This is only correct for 'attachedSink'! var localEnforceDefaultOp = enforceDefaultOp if c.kind == attachedSink: - ## the value needs to be destroyed before we assign the selector - ## or the value is lost + # the value needs to be destroyed before we assign the selector + # or the value is lost let prevKind = c.kind c.kind = attachedDestructor fillBodyObj(c, n, body, x, y, enforceDefaultOp = false) @@ -704,7 +704,10 @@ proc fillBody(c: var TLiftCtx; t: PType; body, x, y: PNode) = defaultOp(c, t, body, x, y) of tyObject: if not considerUserDefinedOp(c, t, body, x, y): - fillBodyObjT(c, t, body, x, y) + if c.kind in {attachedAsgn, attachedSink} and t.sym != nil and sfImportc in t.sym.flags: + body.add newAsgnStmt(x, y) + else: + fillBodyObjT(c, t, body, x, y) of tyDistinct: if not considerUserDefinedOp(c, t, body, x, y): fillBody(c, t[0], body, x, y) diff --git a/tests/arc/timportedobj.nim b/tests/arc/timportedobj.nim new file mode 100644 index 000000000..82d7b4740 --- /dev/null +++ b/tests/arc/timportedobj.nim @@ -0,0 +1,14 @@ +discard """ + cmd: "nim c --gc:arc $file" + action: "compile" +""" + +# bug #13269 + +import posix +proc foo*() = + var last = newSeq[Stat]() + var next = last + for i in 0..3: + last = next +foo() |