diff options
-rw-r--r-- | compiler/jsgen.nim | 8 | ||||
-rw-r--r-- | tests/js/tarrayboundscheck.nim | 6 |
2 files changed, 10 insertions, 4 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 27c4e0e2a..751c043c5 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -1161,9 +1161,9 @@ proc genArrayAddr(p: PProc, n: PNode, r: var TCompRes) = first = firstOrd(p.config, typ[0]) if optBoundsCheck in p.options: useMagic(p, "chckIndx") - r.res = "chckIndx($1, $2, ($3 != null ? $3.length : 0)+$2-1)-$2" % [b.res, rope(first), tmp] + r.res = "chckIndx($1, $2, ($3 != null ? $3.length : 0)+$2-1)-($2)" % [b.res, rope(first), tmp] elif first != 0: - r.res = "($1)-$2" % [b.res, rope(first)] + r.res = "($1)-($2)" % [b.res, rope(first)] else: r.res = b.res r.kind = resExpr @@ -1897,8 +1897,8 @@ proc genMagic(p: PProc, n: PNode, r: var TCompRes) = let rhsIsLit = n[2].kind in nkStrKinds let (a, tmp) = maybeMakeTemp(p, n[1], lhs) if skipTypes(n[1].typ, abstractVarRange).kind == tyCString: - r.res = "if ($1 != null) { $4 += $2; } else { $4 = $2$3; }" % [ - a, rhs.rdLoc, if rhsIsLit: nil else: ~".slice()", tmp] + r.res = "if ($1 != null) { $3 += $2; } else { $3 = $2; }" % [ + a, rhs.rdLoc, tmp] else: r.res = "if ($1 != null) { $4 = ($4).concat($2); } else { $4 = $2$3; }" % [ lhs.rdLoc, rhs.rdLoc, if rhsIsLit: nil else: ~".slice()", tmp] diff --git a/tests/js/tarrayboundscheck.nim b/tests/js/tarrayboundscheck.nim index f0eaeb89d..d8bf8de97 100644 --- a/tests/js/tarrayboundscheck.nim +++ b/tests/js/tarrayboundscheck.nim @@ -39,6 +39,12 @@ proc test_arrayboundscheck() = echo "month out of bounds: ", idx except: echo "idx out of bounds: ", i + + # #13966 + var negativeIndexed: array[-2..2, int] = [0, 1, 2, 3, 4] + negativeIndexed[-1] = 2 + negativeIndexed[1] = 2 + doAssert negativeIndexed == [0, 2, 2, 2, 4] test_arrayboundscheck() {.pop.} \ No newline at end of file |