fixes #14498 [backport:1.2] (#14503)

This commit is contained in:
Andreas Rumpf
2020-05-30 15:32:31 +02:00
committed by GitHub
parent 3105909f88
commit 7ccc7d7e93
4 changed files with 26 additions and 6 deletions

View File

@@ -176,6 +176,7 @@ type
arLocalLValue, # is an l-value, but local var; must not escape
# its stack frame!
arDiscriminant, # is a discriminant
arLentValue, # lent value
arStrange # it is a strange beast like 'typedesc[var T]'
proc exprRoot*(n: PNode): PSym =
@@ -260,9 +261,14 @@ proc isAssignable*(owner: PSym, n: PNode; isUnsafeAddr=false): TAssignableResult
# types that are equal modulo distinction preserve l-value:
result = isAssignable(owner, n[1], isUnsafeAddr)
of nkHiddenDeref:
if isUnsafeAddr and n[0].typ.kind == tyLent: result = arLValue
elif n[0].typ.kind == tyLent: result = arDiscriminant
else: result = arLValue
let n0 = n[0]
if n0.typ.kind == tyLent:
if isUnsafeAddr or (n0.kind == nkSym and n0.sym.kind == skResult):
result = arLValue
else:
result = arLentValue
else:
result = arLValue
of nkDerefExpr, nkHiddenAddr:
result = arLValue
of nkObjUpConv, nkObjDownConv, nkCheckedFieldExpr:

View File

@@ -1712,7 +1712,7 @@ proc semAsgn(c: PContext, n: PNode; mode=asgnNormal): PNode =
if le == nil:
localError(c.config, a.info, "expression has no type")
elif (skipTypes(le, {tyGenericInst, tyAlias, tySink}).kind != tyVar and
isAssignable(c, a) == arNone) or
isAssignable(c, a) in {arNone, arLentValue}) or
skipTypes(le, abstractVar).kind in {tyOpenArray, tyVarargs}:
# Direct assignment to a discriminant is allowed!
localError(c.config, a.info, errXCannotBeAssignedTo %

View File

@@ -7,10 +7,10 @@ type
proc mytest1(s: MyObject, i: int): lent string =
## works fine
if i < s.x.len - 1 and s.x[i] != "":
if i < s.x.len - 1 and s.x[i] != "":
result = s.x[i]
else: raise newException(KeyError, "err1")
proc mytest2(s: MyObject, i: int): lent string =
## reject due to if expr
if i < s.x.len - 1 and s.x[i] != "": s.x[i]

View File

@@ -0,0 +1,14 @@
discard """
errmsg: "'x' cannot be assigned to"
line: 10
"""
proc bug14498 =
var a = @['a', 'b', 'c', 'd', 'e', 'f']
for x in a:
x = 'c'
echo a
bug14498()