diff options
author | cooldome <cdome@bk.ru> | 2020-05-07 21:15:25 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-07 22:15:25 +0200 |
commit | 5fa7d374c4cb777372cf5b967575f228bda23c2b (patch) | |
tree | 1e40c449f26e1d750b420acdca61a2648b876d07 | |
parent | 83435fe6968884d916db79b51ca0e510e67d87c7 (diff) | |
download | Nim-5fa7d374c4cb777372cf5b967575f228bda23c2b.tar.gz |
fix #14243 (#14257)
* fix #14243 Co-authored-by: cooldome <ariabushenko@bk.ru>
-rw-r--r-- | compiler/semmagic.nim | 14 | ||||
-rw-r--r-- | tests/arc/tarcmisc.nim | 16 |
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 |