diff options
-rwxr-xr-x | compiler/ccgexprs.nim | 4 | ||||
-rw-r--r-- | tests/reject/tinvalidarrayaccess.nim | 14 | ||||
-rwxr-xr-x | tools/niminst/buildsh.tmpl | 2 |
3 files changed, 19 insertions, 1 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index abdfbd613..5989d94b3 100755 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -684,6 +684,10 @@ proc genArrayElem(p: BProc, e: PNode, d: var TLoc) = else: lineCg(p, cpsStmts, "if ($1 < $2 || $1 > $3) #raiseIndexError();$n", [rdCharLoc(b), first, intLiteral(lastOrd(ty))]) + else: + let idx = getOrdValue(e.sons[1]) + if idx < firstOrd(ty) or idx > lastOrd(ty): + localError(e.info, errIndexOutOfBounds) if d.k == locNone: d.s = a.s putIntoDest(p, d, elemType(skipTypes(ty, abstractVar)), ropef("$1[($2)- $3]", [rdLoc(a), rdCharLoc(b), first])) diff --git a/tests/reject/tinvalidarrayaccess.nim b/tests/reject/tinvalidarrayaccess.nim new file mode 100644 index 000000000..03105b41b --- /dev/null +++ b/tests/reject/tinvalidarrayaccess.nim @@ -0,0 +1,14 @@ +discard """ + errormsg: "index out of bounds" + line: 11 +""" + + +type TTestArr = array[0..1, int16] +var f: TTestArr +f[0] = 30 +f[1] = 40 +f[2] = 50 +f[3] = 60 + +echo(repr(f)) diff --git a/tools/niminst/buildsh.tmpl b/tools/niminst/buildsh.tmpl index 05145e15c..70f21a691 100755 --- a/tools/niminst/buildsh.tmpl +++ b/tools/niminst/buildsh.tmpl @@ -81,7 +81,7 @@ case $uos in esac case $ucpu in - *i386* | *i486* | *i586* | *i686* | *bepc* ) + *i386* | *i486* | *i586* | *i686* | *bepc* | *i86pc* ) mycpu="i386" ;; *amd*64* | *x86-64* | *x86_64* ) mycpu="amd64" ;; |