mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
implements https://github.com/nim-lang/RFCs/issues/557
It inserts defect handing into a bare except branch
```nim
try:
raiseAssert "test"
except:
echo "nope"
```
=>
```nim
try:
raiseAssert "test"
except:
# New behaviov, now well-defined: **never** catches the assert, regardless of panic mode
raiseDefect()
echo "nope"
```
In this way, `except` still catches foreign exceptions, but panics on
`Defect`. Probably when Nim has `except {.foreign.}`, we can extend
`raiseDefect` to foreign exceptions as well. That's supposed to be a
small use case anyway.
`--legacy:noPanicOnExcept` is provided for a transition period.
(cherry picked from commit 26b86c8f4d)
50 lines
930 B
Nim
50 lines
930 B
Nim
discard """
|
|
output: '''idx out of bounds: -1
|
|
month out of bounds: 0
|
|
Jan
|
|
Feb
|
|
Mar
|
|
Apr
|
|
May
|
|
Jun
|
|
Jul
|
|
Aug
|
|
Sep
|
|
Oct
|
|
Nov
|
|
Dec
|
|
month out of bounds: 13
|
|
idx out of bounds: 14
|
|
'''
|
|
"""
|
|
|
|
{.push boundChecks:on.}
|
|
|
|
# see issue #6532:
|
|
# js backend 0.17.3: array bounds check for non zero based arrays is buggy
|
|
|
|
proc test_arrayboundscheck() =
|
|
var months: array[1..12, string] =
|
|
["Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
|
|
|
var indices = [0,1,2,3,4,5,6,7,8,9,10,11,12,13]
|
|
|
|
for i in -1 .. 14:
|
|
try:
|
|
let idx = indices[i]
|
|
try:
|
|
echo months[idx]
|
|
except IndexDefect:
|
|
echo "month out of bounds: ", idx
|
|
except IndexDefect:
|
|
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.} |