mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-22 15:25:22 +00:00
Fixed addr of bracket expression. Fixes #2148.
This commit is contained in:
@@ -976,14 +976,17 @@ proc genAddr(p: PProc, n: PNode, r: var TCompRes) =
|
||||
genFieldAccess(p, n.sons[0], r)
|
||||
of nkBracketExpr:
|
||||
var ty = skipTypes(n.sons[0].typ, abstractVarRange)
|
||||
if ty.kind in {tyRef, tyPtr}: ty = skipTypes(ty.lastSon, abstractVarRange)
|
||||
case ty.kind
|
||||
of tyArray, tyArrayConstr, tyOpenArray, tySequence, tyString, tyCString,
|
||||
tyVarargs, tyChar:
|
||||
genArrayAddr(p, n.sons[0], r)
|
||||
of tyTuple:
|
||||
genFieldAddr(p, n.sons[0], r)
|
||||
else: internalError(n.sons[0].info, "expr(nkBracketExpr, " & $ty.kind & ')')
|
||||
if ty.kind in MappedToObject:
|
||||
gen(p, n.sons[0], r)
|
||||
else:
|
||||
let kindOfIndexedExpr = n.sons[0].sons[0].typ.kind
|
||||
case kindOfIndexedExpr
|
||||
of tyArray, tyArrayConstr, tyOpenArray, tySequence, tyString, tyCString,
|
||||
tyVarargs:
|
||||
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")
|
||||
|
||||
proc genProcForSymIfNeeded(p: PProc, s: PSym) =
|
||||
|
||||
@@ -40,3 +40,25 @@ indexAddr[] = 'd'
|
||||
doAssert indexAddr[] == 'd'
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user