diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 301b7b3912..6d8cbd5442 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -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: diff --git a/tests/arc/topenarray.nim b/tests/arc/topenarray.nim index 03ec7adf21..47c26a11f8 100644 --- a/tests/arc/topenarray.nim +++ b/tests/arc/topenarray.nim @@ -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))