diff options
author | cooldome <cdome@bk.ru> | 2019-09-21 05:45:27 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-09-21 06:45:27 +0200 |
commit | be82d115764819bf9da799630948676ef6cde42a (patch) | |
tree | c9b1ef8a4a8532f2a20aeb4f6d1bf393411e8049 /compiler | |
parent | c2fced129f9e365f0e6d3391015e2cd24e3fc0fa (diff) | |
download | Nim-be82d115764819bf9da799630948676ef6cde42a.tar.gz |
fixes #12224 (#12225)
* fixes #12224 * improve test
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/parampatterns.nim | 8 | ||||
-rw-r--r-- | compiler/semexprs.nim | 4 |
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) |