Skip to content

Commit c8d3814

Browse files
committed
Hint slice.{r}position is within slice bounds
1 parent 690ff04 commit c8d3814

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

src/libcore/slice/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1199,8 +1199,10 @@ macro_rules! iterator {
11991199
fn position<F>(&mut self, mut predicate: F) -> Option<usize>
12001200
where F: FnMut(Self::Item) -> bool,
12011201
{
1202+
let len = self.len();
12021203
let mut index = 0;
12031204
self.search_while(None, move |elt| {
1205+
unsafe { assume(index < len); }
12041206
if predicate(elt) {
12051207
SearchWhile::Done(Some(index))
12061208
} else {
@@ -1213,9 +1215,11 @@ macro_rules! iterator {
12131215
fn rposition<F>(&mut self, mut predicate: F) -> Option<usize>
12141216
where F: FnMut(Self::Item) -> bool,
12151217
{
1218+
let len = self.len();
12161219
let mut index = self.len();
12171220
self.rsearch_while(None, move |elt| {
12181221
index -= 1;
1222+
unsafe { assume(index < len); }
12191223
if predicate(elt) {
12201224
SearchWhile::Done(Some(index))
12211225
} else {

src/libcore/tests/slice.rs

+19
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,25 @@ use core::slice::heapsort;
1313
use core::result::Result::{Ok, Err};
1414
use rand::{Rng, XorShiftRng};
1515

16+
17+
#[test]
18+
fn test_position() {
19+
let b = [1, 2, 3, 5, 5];
20+
assert!(b.iter().position(|&v| v == 9) == None);
21+
assert!(b.iter().position(|&v| v == 5) == Some(3));
22+
assert!(b.iter().position(|&v| v == 3) == Some(2));
23+
assert!(b.iter().position(|&v| v == 0) == None);
24+
}
25+
26+
#[test]
27+
fn test_rposition() {
28+
let b = [1, 2, 3, 5, 5];
29+
assert!(b.iter().rposition(|&v| v == 9) == None);
30+
assert!(b.iter().rposition(|&v| v == 5) == Some(4));
31+
assert!(b.iter().rposition(|&v| v == 3) == Some(2));
32+
assert!(b.iter().rposition(|&v| v == 0) == None);
33+
}
34+
1635
#[test]
1736
fn test_binary_search() {
1837
let b = [1, 2, 4, 6, 8, 9];

0 commit comments

Comments
 (0)