diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2021-09-22 15:07:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-22 15:07:36 +0200 |
commit | 6163bdd279a2c33d4290223cc7f466c8070b8ce4 (patch) | |
tree | 023a95eda4ded4c8b91d0b95340fa2bbb7536f05 | |
parent | 0ad601d3c1657216d27be839173861594e3e2421 (diff) | |
download | Nim-6163bdd279a2c33d4290223cc7f466c8070b8ce4.tar.gz |
closes #16132 [backport] (#18880)
* closes #16132 [backport] * fixes #16132 [backport]
-rw-r--r-- | compiler/semexprs.nim | 13 | ||||
-rw-r--r-- | tests/views/tviews1.nim | 14 |
2 files changed, 21 insertions, 6 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index ee2626922..9134c1301 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1667,11 +1667,14 @@ proc takeImplicitAddr(c: PContext, n: PNode; isLent: bool): PNode = proc asgnToResultVar(c: PContext, n, le, ri: PNode) {.inline.} = if le.kind == nkHiddenDeref: var x = le[0] - if x.kind == nkSym and x.sym.kind == skResult and (x.typ.kind in {tyVar, tyLent} or classifyViewType(x.typ) != noView): - n[0] = x # 'result[]' --> 'result' - n[1] = takeImplicitAddr(c, ri, x.typ.kind == tyLent) - x.typ.flags.incl tfVarIsPtr - #echo x.info, " setting it for this type ", typeToString(x.typ), " ", n.info + if x.kind == nkSym: + if x.sym.kind == skResult and (x.typ.kind in {tyVar, tyLent} or classifyViewType(x.typ) != noView): + n[0] = x # 'result[]' --> 'result' + n[1] = takeImplicitAddr(c, ri, x.typ.kind == tyLent) + x.typ.flags.incl tfVarIsPtr + #echo x.info, " setting it for this type ", typeToString(x.typ), " ", n.info + elif sfGlobal in x.sym.flags: + x.typ.flags.incl tfVarIsPtr proc borrowCheck(c: PContext, n, le, ri: PNode) = const diff --git a/tests/views/tviews1.nim b/tests/views/tviews1.nim index 51f17b9d6..49d79c5b5 100644 --- a/tests/views/tviews1.nim +++ b/tests/views/tviews1.nim @@ -5,7 +5,8 @@ discard """ 3 2 3 -3''' +3 +15''' targets: "c cpp" """ @@ -26,3 +27,14 @@ proc main(s: seq[int]) = take x main(@[11, 22, 33]) + +var x: int + +proc foo(x: var int): var int = + once: x = 42 + return x + +var y: var int = foo(x) +y = 15 +echo foo(x) +# bug #16132 |