fixes #20954; bounchecks for len(toOpenArray()) [backport] (#20956)

* bounchecks for len(toOpenArray())

* add a testcase
This commit is contained in:
ringabout
2022-12-06 05:27:18 +08:00
committed by GitHub
parent a8090f7d65
commit b83bd282dc
2 changed files with 20 additions and 0 deletions

View File

@@ -1879,9 +1879,13 @@ proc genArrayLen(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
# Bug #9279, len(toOpenArray()) has to work:
if a.kind in nkCallKinds and a[0].kind == nkSym and a[0].sym.magic == mSlice:
# magic: pass slice to openArray:
var m: TLoc
var b, c: TLoc
initLocExpr(p, a[1], m)
initLocExpr(p, a[2], b)
initLocExpr(p, a[3], c)
if optBoundsCheck in p.options:
genBoundsCheck(p, m, b, c)
if op == mHigh:
putIntoDest(p, d, e, ropecg(p.module, "($2)-($1)", [rdLoc(b), rdLoc(c)]))
else:

View File

@@ -22,3 +22,19 @@ block: # bug 18627
for i in params.toOpenArray(0, params.len - 1):
echo i
uciLoop2()
when defined(nimPreviewSlimSystem):
import std/assertions
block: # bug #20954
block:
doAssertRaises(IndexDefect):
var v: array[10, int]
echo len(toOpenArray(v, 20, 30))
block:
doAssertRaises(IndexDefect):
var v: seq[int]
echo len(toOpenArray(v, 20, 30))