This commit is contained in:
ringabout
2026-06-02 19:45:31 +08:00
parent 73986c03a1
commit 3684266866
3 changed files with 43 additions and 1 deletions

View File

@@ -1842,6 +1842,8 @@ proc genArrAccessOpcode(c: PCtx; n: PNode; dest: var TDest; opc: TOpcode;
if dest < 0: dest = c.getTemp(n.typ)
if opc in {opcLdArrAddr, opcLdStrIdxAddr} and gfNodeAddr in flags:
c.gABC(n, opc, dest, a, b)
if c.prc.regInfo[a].kind >= slotTempUnknown:
c.prc.regInfo[a].kind = slotTempPerm
elif needsRegLoad():
var cc = c.getTemp(n.typ)
c.gABC(n, opc, cc, a, b)
@@ -1858,6 +1860,8 @@ proc genObjAccessAux(c: PCtx; n: PNode; a, b: int, dest: var TDest; flags: TGenF
if dest < 0: dest = c.getTemp(n.typ)
if {gfNodeAddr} * flags != {}:
c.gABC(n, opcLdObjAddr, dest, a, b)
if a < c.prc.regInfo.len and c.prc.regInfo[a].kind >= slotTempUnknown:
c.prc.regInfo[a].kind = slotTempPerm
elif needsRegLoad():
var cc = c.getTemp(n.typ)
c.gABC(n, opcLdObj, cc, a, b)

View File

@@ -37,7 +37,7 @@ iterator mitems*[T](a: var openArray[T]): var T {.inline.} =
yield a[i]
unCheckedInc(i)
iterator items*[IX, T](a: array[IX, T]): T {.inline.} =
iterator items*[IX, T](a: array[IX, T]): lent2 T {.inline.} =
## Iterates over each item of `a`.
when a.len > 0:
var i = low(IX)

View File

@@ -0,0 +1,38 @@
discard """
targets: "c cpp js"
"""
template sameAddress(a, b): bool =
when defined(js):
a == b
else:
a.unsafeAddr == b.unsafeAddr
proc main() =
block:
let a = [10, 11, 12]
for ai in items(a):
doAssert sameAddress(ai, a[0])
break
block:
let a = [[1, 2], [1, 2], [1, 2]]
for ai in items(a):
doAssert sameAddress(ai[0], a[0][0])
break
block:
let s = @[(1, 2), (3, 4), (5, 6)]
doAssert (3, 4) in s
main()
static:
main()
block: # issue #25849
static:
const key = "NIM_TESTS_TOSENV_KEY"
for val in ["val", "", "\xc3\x86"]:
let s = @[(key, "val"), (key, ""), (key, "\xc3\x86")]
doAssert (key, val) in s