1#[cfg(flux)]
2use core::ops;
3
4use flux_attrs::*;
5
6#[extern_spec(core::slice)]
7impl<T, I: SliceIndex<[T]>> ops::Index<I> for [T] {
8 #![reft(
9 fn in_bounds(len: int, idx: I) -> bool {
10 <I as SliceIndex<[T]>>::in_bounds(idx, len)
11 }
12 )]
13
14 #[sig(fn(&Self[@len], {I[@idx] | <Self as ops::Index<I>>::in_bounds(len, idx)}) -> &I::Output)]
15 fn index(&self, index: I) -> &I::Output;
16}
17
18#[extern_spec(core::slice)]
19trait SliceIndex<T> {
20 #![reft(fn in_bounds(idx: Self, v: T) -> bool { true })] }
22
23#[extern_spec(core::slice)]
24impl<T> SliceIndex<[T]> for usize {
25 #![reft(fn in_bounds(idx: int, len: int) -> bool { idx < len })] }
27
28#[extern_spec(core::slice)]
29impl<T> SliceIndex<[T]> for ops::Range<usize> {
30 #![reft(
31 fn in_bounds(r: ops::Range<int>, len: int) -> bool {
32 r.start <= r.end && r.end < len
33 }
34 )] }
36
37#[cfg(flux_sysroot_test)]
38mod tests {
39 #![allow(dead_code)]
40
41 use flux_attrs::*;
42
43 #[sig(fn(&[i32]{n: n > 10}))]
44 fn test00(xs: &[i32]) {
45 let _y = &xs[0..1];
46 }
47
48 #[should_fail]
49 fn test01(xs: &[i32]) {
50 let _y = &xs[0..1];
51 }
52}