diff options
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) |