summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2021-09-22 15:07:36 +0200
committerGitHub <noreply@github.com>2021-09-22 15:07:36 +0200
commit6163bdd279a2c33d4290223cc7f466c8070b8ce4 (patch)
tree023a95eda4ded4c8b91d0b95340fa2bbb7536f05
parent0ad601d3c1657216d27be839173861594e3e2421 (diff)
downloadNim-6163bdd279a2c33d4290223cc7f466c8070b8ce4.tar.gz
closes #16132 [backport] (#18880)
* closes #16132 [backport]

* fixes #16132 [backport]
-rw-r--r--compiler/semexprs.nim13
-rw-r--r--tests/views/tviews1.nim14
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