summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorcooldome <cdome@bk.ru>2019-09-21 05:45:27 +0100
committerAndreas Rumpf <rumpf_a@web.de>2019-09-21 06:45:27 +0200
commitbe82d115764819bf9da799630948676ef6cde42a (patch)
treec9b1ef8a4a8532f2a20aeb4f6d1bf393411e8049 /compiler
parentc2fced129f9e365f0e6d3391015e2cd24e3fc0fa (diff)
downloadNim-be82d115764819bf9da799630948676ef6cde42a.tar.gz
fixes #12224 (#12225)
* fixes #12224

* improve test
Diffstat (limited to 'compiler')
-rw-r--r--compiler/parampatterns.nim8
-rw-r--r--compiler/semexprs.nim4
2 files changed, 7 insertions, 5 deletions
diff --git a/compiler/parampatterns.nim b/compiler/parampatterns.nim
index b8f1fd832..78ba68ae6 100644
--- a/compiler/parampatterns.nim
+++ b/compiler/parampatterns.nim
@@ -218,14 +218,16 @@ proc isAssignable*(owner: PSym, n: PNode; isUnsafeAddr=false): TAssignableResult
   of nkSym:
     let kinds = if isUnsafeAddr: {skVar, skResult, skTemp, skParam, skLet, skForVar}
                 else: {skVar, skResult, skTemp}
-    if n.sym.kind in kinds:
+    if n.sym.kind == skParam and n.sym.typ.kind in {tyVar, tySink}:
+      result = arLValue
+    elif isUnsafeAddr and n.sym.kind == skParam:
+      result = arLValue
+    elif n.sym.kind in kinds:
       if owner != nil and owner == n.sym.owner and
           sfGlobal notin n.sym.flags:
         result = arLocalLValue
       else:
         result = arLValue
-    elif n.sym.kind == skParam and n.sym.typ.kind in {tyVar, tySink}:
-      result = arLValue
     elif n.sym.kind == skType:
       let t = n.sym.typ.skipTypes({tyTypeDesc})
       if t.kind == tyVar: result = arStrange
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index 3d529509c..2f0eccd8c 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -1561,11 +1561,11 @@ proc takeImplicitAddr(c: PContext, n: PNode; isLent: bool): PNode =
   of nkBracketExpr:
     if len(n) == 1: return n.sons[0]
   else: discard
-  let valid = isAssignable(c, n)
+  let valid = isAssignable(c, n, isLent)
   if valid != arLValue:
     if valid == arLocalLValue:
       localError(c.config, n.info, errXStackEscape % renderTree(n, {renderNoComments}))
-    elif not isLent:
+    else:
       localError(c.config, n.info, errExprHasNoAddress)
   result = newNodeIT(nkHiddenAddr, n.info, makePtrType(c, n.typ))
   result.add(n)