fixed system.delete (#18507)
This commit is contained in:
parent
adba5eb45e
commit
99c4b69097
3 changed files with 26 additions and 12 deletions
13
changelog.md
13
changelog.md
|
|
@ -4,7 +4,18 @@
|
||||||
|
|
||||||
## Changes affecting backward compatibility
|
## Changes affecting backward compatibility
|
||||||
|
|
||||||
- Deprecated `std/mersenne`
|
- Deprecated `std/mersenne`.
|
||||||
|
|
||||||
|
- `system.delete` had a most surprising behavior when the index passed to it was out of
|
||||||
|
bounds (it would delete the last entry then). Compile with `-d:nimStrictDelete` so
|
||||||
|
that an index error is produced instead. But be aware that your code might depend on
|
||||||
|
this quirky behavior so a review process is required on your part before you can
|
||||||
|
use `-d:nimStrictDelete`. To make this review easier, use the `-d:nimAuditDelete`
|
||||||
|
switch, it pretends that `system.delete` is deprecated so that it is easier to see
|
||||||
|
where it was used in your code.
|
||||||
|
|
||||||
|
`-d:nimStrictDelete` will become the default in upcoming versions.
|
||||||
|
|
||||||
|
|
||||||
- `cuchar` is now deprecated as it aliased `char` where arguably it should have aliased `uint8`.
|
- `cuchar` is now deprecated as it aliased `char` where arguably it should have aliased `uint8`.
|
||||||
Please use `char` or `uint8` instead.
|
Please use `char` or `uint8` instead.
|
||||||
|
|
|
||||||
|
|
@ -2134,7 +2134,12 @@ const
|
||||||
import system/dollars
|
import system/dollars
|
||||||
export dollars
|
export dollars
|
||||||
|
|
||||||
proc delete*[T](x: var seq[T], i: Natural) {.noSideEffect.} =
|
when defined(nimAuditDelete):
|
||||||
|
{.pragma: auditDelete, deprecated: "review this call for out of bounds behavior".}
|
||||||
|
else:
|
||||||
|
{.pragma: auditDelete.}
|
||||||
|
|
||||||
|
proc delete*[T](x: var seq[T], i: Natural) {.noSideEffect, auditDelete.} =
|
||||||
## Deletes the item at index `i` by moving all `x[i+1..^1]` items by one position.
|
## Deletes the item at index `i` by moving all `x[i+1..^1]` items by one position.
|
||||||
##
|
##
|
||||||
## This is an `O(n)` operation.
|
## This is an `O(n)` operation.
|
||||||
|
|
@ -2147,12 +2152,10 @@ proc delete*[T](x: var seq[T], i: Natural) {.noSideEffect.} =
|
||||||
s.delete(2)
|
s.delete(2)
|
||||||
doAssert s == @[1, 2, 4, 5]
|
doAssert s == @[1, 2, 4, 5]
|
||||||
|
|
||||||
doAssertRaises(IndexDefect):
|
when defined(nimStrictDelete):
|
||||||
s.delete(4)
|
if i > high(x):
|
||||||
|
# xxx this should call `raiseIndexError2(i, high(x))` after some refactoring
|
||||||
if i > high(x):
|
raise (ref IndexDefect)(msg: "index out of bounds: '" & $i & "' < '" & $x.len & "' failed")
|
||||||
# xxx this should call `raiseIndexError2(i, high(x))` after some refactoring
|
|
||||||
raise (ref IndexDefect)(msg: "index out of bounds: '" & $i & "' < '" & $x.len & "' failed")
|
|
||||||
|
|
||||||
template defaultImpl =
|
template defaultImpl =
|
||||||
let xl = x.len
|
let xl = x.len
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ template main =
|
||||||
s.delete(1)
|
s.delete(1)
|
||||||
doAssert s == @["foo"]
|
doAssert s == @["foo"]
|
||||||
|
|
||||||
block:
|
when false:
|
||||||
var s: seq[string]
|
var s: seq[string]
|
||||||
doAssertRaises(IndexDefect):
|
doAssertRaises(IndexDefect):
|
||||||
s.delete(0)
|
s.delete(0)
|
||||||
|
|
@ -67,7 +67,7 @@ template main =
|
||||||
s.delete(0)
|
s.delete(0)
|
||||||
doAssert s == @[]
|
doAssert s == @[]
|
||||||
|
|
||||||
block: # bug #16544: deleting out of bounds index should raise
|
when false: # bug #16544: deleting out of bounds index should raise
|
||||||
var s = @["foo"]
|
var s = @["foo"]
|
||||||
doAssertRaises(IndexDefect):
|
doAssertRaises(IndexDefect):
|
||||||
s.delete(1)
|
s.delete(1)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue