summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorcooldome <cdome@bk.ru>2020-05-07 21:15:25 +0100
committerGitHub <noreply@github.com>2020-05-07 22:15:25 +0200
commit5fa7d374c4cb777372cf5b967575f228bda23c2b (patch)
tree1e40c449f26e1d750b420acdca61a2648b876d07
parent83435fe6968884d916db79b51ca0e510e67d87c7 (diff)
downloadNim-5fa7d374c4cb777372cf5b967575f228bda23c2b.tar.gz
fix #14243 (#14257)
* fix #14243

Co-authored-by: cooldome <ariabushenko@bk.ru>
-rw-r--r--compiler/semmagic.nim14
-rw-r--r--tests/arc/tarcmisc.nim16
2 files changed, 24 insertions, 6 deletions
diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim
index 53a19fae6..438f2dbc7 100644
--- a/compiler/semmagic.nim
+++ b/compiler/semmagic.nim
@@ -402,14 +402,18 @@ proc turnFinalizerIntoDestructor(c: PContext; orig: PSym; info: TLineInfo): PSym
   # Replace nkDerefExpr by nkHiddenDeref
   # nkDeref is for 'ref T':  x[].field
   # nkHiddenDeref is for 'var T': x<hidden deref [] here>.field
-  proc transform(n: PNode; old, fresh: PType; oldParam, newParam: PSym): PNode =
+  proc transform(procSym: PSym; n: PNode; old, fresh: PType; oldParam, newParam: PSym): PNode =
     result = shallowCopy(n)
     if sameTypeOrNil(n.typ, old):
       result.typ = fresh
-    if n.kind == nkSym and n.sym == oldParam:
-      result.sym = newParam
+    if n.kind == nkSym:
+      if n.sym == oldParam:
+        result.sym = newParam
+      elif n.sym.owner == orig:
+        result.sym = copySym(n.sym)
+        result.sym.owner = procSym
     for i in 0 ..< safeLen(n):
-      result[i] = transform(n[i], old, fresh, oldParam, newParam)
+      result[i] = transform(procSym, n[i], old, fresh, oldParam, newParam)
     #if n.kind == nkDerefExpr and sameType(n[0].typ, old):
     #  result =
 
@@ -423,7 +427,7 @@ proc turnFinalizerIntoDestructor(c: PContext; orig: PSym; info: TLineInfo): PSym
   let newParam = newSym(skParam, oldParam.name, result, result.info)
   newParam.typ = newParamType
   # proc body:
-  result.ast = transform(orig.ast, origParamType, newParamType, oldParam, newParam)
+  result.ast = transform(result, orig.ast, origParamType, newParamType, oldParam, newParam)
   # proc signature:
   result.typ = newProcType(result.info, result)
   result.typ.addParam newParam
diff --git a/tests/arc/tarcmisc.nim b/tests/arc/tarcmisc.nim
index 953e2f3a7..79c947e82 100644
--- a/tests/arc/tarcmisc.nim
+++ b/tests/arc/tarcmisc.nim
@@ -104,4 +104,18 @@ proc re(x: static[string]): static MyType =
 proc match(inp: string, rg: static MyType) = 
   doAssert rg.a.len == 0
 
-match("ac", re"a(b|c)")
\ No newline at end of file
+match("ac", re"a(b|c)")
+
+#------------------------------------------------------------------------------
+# issue #14243
+
+type
+  Game* = ref object
+
+proc free*(game: Game) =
+  let a = 5
+
+proc newGame*(): Game =
+  new(result, free)
+
+var game*: Game
\ No newline at end of file