Merge pull request #2903 from yglukhov/js-bracket-addr
Fixed addr of bracket expression. Fixes #2148.
This commit is contained in:
commit
2782cddb56
2 changed files with 33 additions and 8 deletions
|
|
@ -946,14 +946,17 @@ proc genAddr(p: PProc, n: PNode, r: var TCompRes) =
|
||||||
genFieldAccess(p, n.sons[0], r)
|
genFieldAccess(p, n.sons[0], r)
|
||||||
of nkBracketExpr:
|
of nkBracketExpr:
|
||||||
var ty = skipTypes(n.sons[0].typ, abstractVarRange)
|
var ty = skipTypes(n.sons[0].typ, abstractVarRange)
|
||||||
if ty.kind in {tyRef, tyPtr}: ty = skipTypes(ty.lastSon, abstractVarRange)
|
if ty.kind in MappedToObject:
|
||||||
case ty.kind
|
gen(p, n.sons[0], r)
|
||||||
of tyArray, tyArrayConstr, tyOpenArray, tySequence, tyString, tyCString,
|
else:
|
||||||
tyVarargs, tyChar:
|
let kindOfIndexedExpr = skipTypes(n.sons[0].sons[0].typ, abstractVarRange).kind
|
||||||
genArrayAddr(p, n.sons[0], r)
|
case kindOfIndexedExpr
|
||||||
of tyTuple:
|
of tyArray, tyArrayConstr, tyOpenArray, tySequence, tyString, tyCString,
|
||||||
genFieldAddr(p, n.sons[0], r)
|
tyVarargs:
|
||||||
else: internalError(n.sons[0].info, "expr(nkBracketExpr, " & $ty.kind & ')')
|
genArrayAddr(p, n.sons[0], r)
|
||||||
|
of tyTuple:
|
||||||
|
genFieldAddr(p, n.sons[0], r)
|
||||||
|
else: internalError(n.sons[0].info, "expr(nkBracketExpr, " & $kindOfIndexedExpr & ')')
|
||||||
else: internalError(n.sons[0].info, "genAddr")
|
else: internalError(n.sons[0].info, "genAddr")
|
||||||
|
|
||||||
proc genProcForSymIfNeeded(p: PProc, s: PSym) =
|
proc genProcForSymIfNeeded(p: PProc, s: PSym) =
|
||||||
|
|
|
||||||
|
|
@ -40,3 +40,25 @@ indexAddr[] = 'd'
|
||||||
doAssert indexAddr[] == 'd'
|
doAssert indexAddr[] == 'd'
|
||||||
|
|
||||||
doAssert obj.s == "lodem ipsum dolor sit amet"
|
doAssert obj.s == "lodem ipsum dolor sit amet"
|
||||||
|
|
||||||
|
# Bug #2148
|
||||||
|
var x: array[2, int]
|
||||||
|
var y = addr x[1]
|
||||||
|
|
||||||
|
y[] = 12
|
||||||
|
doAssert(x[1] == 12)
|
||||||
|
|
||||||
|
type
|
||||||
|
Foo = object
|
||||||
|
bar: int
|
||||||
|
|
||||||
|
var foo: array[2, Foo]
|
||||||
|
var z = addr foo[1]
|
||||||
|
|
||||||
|
z[].bar = 12345
|
||||||
|
doAssert(foo[1].bar == 12345)
|
||||||
|
|
||||||
|
var t : tuple[a, b: int]
|
||||||
|
var pt = addr t[1]
|
||||||
|
pt[] = 123
|
||||||
|
doAssert(t.b == 123)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue