diff options
-rw-r--r-- | compiler/ccgexprs.nim | 11 | ||||
-rw-r--r-- | compiler/condsyms.nim | 1 |
2 files changed, 9 insertions, 3 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index eb67db2b3..a3a85a3dc 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -909,9 +909,14 @@ proc genSeqElem(p: BProc, n, x, y: PNode, d: var TLoc) = if ty.kind in {tyRef, tyPtr}: ty = skipTypes(ty.lastSon, abstractVarRange) # emit range check: if optBoundsCheck in p.options: - linefmt(p, cpsStmts, - "if (!$2 || (NU)($1) >= (NU)($2->$3)) #raiseIndexError();$n", - rdLoc(b), rdLoc(a), lenField(p)) + if ty.kind == tyString and not defined(nimNoZeroTerminator): + linefmt(p, cpsStmts, + "if (!$2 || (NU)($1) > (NU)($2->$3)) #raiseIndexError();$n", + rdLoc(b), rdLoc(a), lenField(p)) + else: + linefmt(p, cpsStmts, + "if (!$2 || (NU)($1) >= (NU)($2->$3)) #raiseIndexError();$n", + rdLoc(b), rdLoc(a), lenField(p)) if d.k == locNone: d.storage = OnHeap if skipTypes(a.t, abstractVar).kind in {tyRef, tyPtr}: a.r = rfmt(nil, "(*$1)", a.r) diff --git a/compiler/condsyms.nim b/compiler/condsyms.nim index 08dda9b6a..b1d0ccc7a 100644 --- a/compiler/condsyms.nim +++ b/compiler/condsyms.nim @@ -115,3 +115,4 @@ proc initDefines*() = defineSymbol("nimSymKind") defineSymbol("nimVmEqIdent") defineSymbol("nimNoNil") + defineSymbol("nimNoZeroTerminator") |