Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions library/alloc/src/collections/vec_deque/iter.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
use core::iter::{FusedIterator, TrustedLen, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
#[cfg(kani)]
use core::kani;
use core::num::NonZero;
use core::ops::Try;
use core::{fmt, mem, slice};

use safety::requires;

/// An iterator over the elements of a `VecDeque`.
///
/// This `struct` is created by the [`iter`] method on [`super::VecDeque`]. See its
Expand Down Expand Up @@ -144,6 +148,8 @@ impl<'a, T> Iterator for Iter<'a, T> {
}

#[inline]
#[requires(idx < self.len())]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item {
// Safety: The TrustedRandomAccess contract requires that callers only pass an index
// that is in bounds.
Expand Down
6 changes: 6 additions & 0 deletions library/alloc/src/collections/vec_deque/iter_mut.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
use core::iter::{FusedIterator, TrustedLen, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
#[cfg(kani)]
use core::kani;
use core::num::NonZero;
use core::ops::Try;
use core::{fmt, mem, slice};

use safety::requires;

/// A mutable iterator over the elements of a `VecDeque`.
///
/// This `struct` is created by the [`iter_mut`] method on [`super::VecDeque`]. See its
Expand Down Expand Up @@ -208,6 +212,8 @@ impl<'a, T> Iterator for IterMut<'a, T> {
}

#[inline]
#[requires(idx < self.len())]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item {
// Safety: The TrustedRandomAccess contract requires that callers only pass an index
// that is in bounds.
Expand Down
6 changes: 6 additions & 0 deletions library/alloc/src/vec/into_iter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ use core::iter::{
FusedIterator, InPlaceIterable, SourceIter, TrustedFused, TrustedLen,
TrustedRandomAccessNoCoerce,
};
#[cfg(kani)]
use core::kani;
use core::marker::PhantomData;
use core::mem::{ManuallyDrop, MaybeUninit, SizedTypeProperties};
use core::num::NonZero;
Expand All @@ -11,6 +13,8 @@ use core::ptr::{self, NonNull};
use core::slice::{self};
use core::{array, fmt};

use safety::requires;

#[cfg(not(no_global_oom_handling))]
use super::AsVecIntoIter;
use crate::alloc::{Allocator, Global};
Expand Down Expand Up @@ -354,6 +358,8 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
R::from_output(accum)
}

#[requires(i < self.len())]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn __iterator_get_unchecked(&mut self, i: usize) -> Self::Item
where
Self: TrustedRandomAccessNoCoerce,
Expand Down
8 changes: 8 additions & 0 deletions library/core/src/array/iter.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
//! Defines the `IntoIter` owned iterator for arrays.

use safety::requires;

use crate::intrinsics::transmute_unchecked;
use crate::iter::{FusedIterator, TrustedLen, TrustedRandomAccessNoCoerce};
#[cfg(kani)]
use crate::kani;
use crate::mem::MaybeUninit;
use crate::num::NonZero;
use crate::ops::{IndexRange, Range, Try};
Expand Down Expand Up @@ -138,6 +142,8 @@ impl<T, const N: usize> IntoIter<T, N> {
/// ```
#[unstable(feature = "array_into_iter_constructors", issue = "91583")]
#[inline]
#[requires(initialized.start <= initialized.end)]
#[requires(initialized.end <= N)]
pub const unsafe fn new_unchecked(
buffer: [MaybeUninit<T>; N],
initialized: Range<usize>,
Expand Down Expand Up @@ -279,6 +285,8 @@ impl<T, const N: usize> Iterator for IntoIter<T, N> {
}

#[inline]
#[requires(idx < self.len())]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item {
// SAFETY: The caller must provide an idx that is in bound of the remainder.
let elem_ref = unsafe { self.as_mut_slice().get_unchecked_mut(idx) };
Expand Down
8 changes: 8 additions & 0 deletions library/core/src/char/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ mod convert;
mod decode;
mod methods;

use safety::requires;

// stable re-exports
#[rustfmt::skip]
#[stable(feature = "try_from", since = "1.34.0")]
Expand All @@ -47,6 +49,8 @@ use crate::error::Error;
use crate::escape::{AlwaysEscaped, EscapeIterInner, MaybeEscaped};
use crate::fmt::{self, Write};
use crate::iter::{FusedIterator, TrustedLen, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
#[cfg(kani)]
use crate::kani;
use crate::num::NonZero;

// UTF-8 ranges and tags for encoding characters
Expand Down Expand Up @@ -138,6 +142,7 @@ pub const fn from_u32(i: u32) -> Option<char> {
#[rustc_const_stable(feature = "const_char_from_u32_unchecked", since = "1.81.0")]
#[must_use]
#[inline]
#[requires(i <= 0x10FFFF && (i < 0xD800 || i > 0xDFFF))]
pub const unsafe fn from_u32_unchecked(i: u32) -> char {
// SAFETY: the safety contract must be upheld by the caller.
unsafe { self::convert::from_u32_unchecked(i) }
Expand Down Expand Up @@ -399,6 +404,7 @@ macro_rules! casemappingiter_impls {
self.0.advance_by(n)
}

#[requires(idx < self.0.len())]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item {
// SAFETY: just forwarding requirements to caller
unsafe { self.0.__iterator_get_unchecked(idx) }
Expand Down Expand Up @@ -533,6 +539,8 @@ impl Iterator for CaseMappingIter {
self.0.advance_by(n)
}

#[requires(idx < self.len())]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item {
// SAFETY: just forwarding requirements to caller
unsafe { self.0.__iterator_get_unchecked(idx) }
Expand Down
5 changes: 5 additions & 0 deletions library/core/src/iter/adapters/cloned.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
use core::num::NonZero;

use safety::requires;

use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::adapters::{SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen, UncheckedIterator};
#[cfg(kani)]
use crate::kani;
use crate::ops::Try;

/// An iterator that clones the elements of an underlying iterator.
Expand Down Expand Up @@ -61,6 +65,7 @@ where
self.it.map(T::clone).fold(init, f)
}

#[requires(idx < self.it.size_hint().0)]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> T
where
Self: TrustedRandomAccessNoCoerce,
Expand Down
5 changes: 5 additions & 0 deletions library/core/src/iter/adapters/copied.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
use safety::requires;

use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::adapters::{SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen};
#[cfg(kani)]
use crate::kani;
use crate::mem::{MaybeUninit, SizedTypeProperties};
use crate::num::NonZero;
use crate::ops::Try;
Expand Down Expand Up @@ -92,6 +96,7 @@ where
self.it.advance_by(n)
}

#[requires(idx < self.it.size_hint().0)]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> T
where
Self: TrustedRandomAccessNoCoerce,
Expand Down
6 changes: 6 additions & 0 deletions library/core/src/iter/adapters/enumerate.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
use safety::requires;

use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::adapters::{SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
use crate::iter::{FusedIterator, InPlaceIterable, TrustedFused, TrustedLen};
#[cfg(kani)]
use crate::kani;
use crate::num::NonZero;
use crate::ops::Try;

Expand Down Expand Up @@ -160,6 +164,8 @@ where

#[rustc_inherit_overflow_checks]
#[inline]
#[requires(idx < self.iter.size_hint().0)]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> <Self as Iterator>::Item
where
Self: TrustedRandomAccessNoCoerce,
Expand Down
6 changes: 6 additions & 0 deletions library/core/src/iter/adapters/fuse.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
use safety::requires;

use crate::intrinsics;
use crate::iter::adapters::SourceIter;
use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::{
FusedIterator, TrustedFused, TrustedLen, TrustedRandomAccess, TrustedRandomAccessNoCoerce,
};
#[cfg(kani)]
use crate::kani;
use crate::ops::Try;

/// An iterator that yields `None` forever after the underlying iterator
Expand Down Expand Up @@ -109,6 +113,8 @@ where
}

#[inline]
#[requires(self.iter.is_some() && idx < self.iter.as_ref().unwrap().size_hint().0)]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item
where
Self: TrustedRandomAccessNoCoerce,
Expand Down
5 changes: 5 additions & 0 deletions library/core/src/iter/adapters/map.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
use safety::requires;

use crate::fmt;
use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::adapters::{SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
use crate::iter::{FusedIterator, InPlaceIterable, TrustedFused, TrustedLen, UncheckedIterator};
#[cfg(kani)]
use crate::kani;
use crate::num::NonZero;
use crate::ops::Try;

Expand Down Expand Up @@ -129,6 +133,7 @@ where
}

#[inline]
#[requires(idx < self.iter.size_hint().0)]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> B
where
Self: TrustedRandomAccessNoCoerce,
Expand Down
6 changes: 6 additions & 0 deletions library/core/src/iter/adapters/skip.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
use safety::requires;

use crate::intrinsics::unlikely;
use crate::iter::adapters::SourceIter;
use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::{
FusedIterator, InPlaceIterable, TrustedFused, TrustedLen, TrustedRandomAccess,
TrustedRandomAccessNoCoerce,
};
#[cfg(kani)]
use crate::kani;
use crate::num::NonZero;
use crate::ops::{ControlFlow, Try};

Expand Down Expand Up @@ -158,6 +162,8 @@ where
}

#[doc(hidden)]
#[requires(idx + self.n < self.iter.size_hint().0)]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item
where
Self: TrustedRandomAccessNoCoerce,
Expand Down
7 changes: 7 additions & 0 deletions library/core/src/iter/adapters/zip.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
use safety::requires;

use crate::cmp;
use crate::fmt::{self, Debug};
use crate::iter::{
FusedIterator, InPlaceIterable, SourceIter, TrustedFused, TrustedLen, UncheckedIterator,
};
#[cfg(kani)]
use crate::kani;
use crate::num::NonZero;

/// An iterator that iterates two other iterators simultaneously.
Expand Down Expand Up @@ -104,6 +108,8 @@ where
}

#[inline]
#[requires(idx < self.size_hint().0)]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item
where
Self: TrustedRandomAccessNoCoerce,
Expand Down Expand Up @@ -264,6 +270,7 @@ where
}

#[inline]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn get_unchecked(&mut self, idx: usize) -> <Self as Iterator>::Item {
let idx = self.index + idx;
// SAFETY: the caller must uphold the contract for
Expand Down
1 change: 1 addition & 0 deletions library/core/src/iter/range.rs
Original file line number Diff line number Diff line change
Expand Up @@ -933,6 +933,7 @@ impl<A: Step> Iterator for ops::Range<A> {
}

#[inline]
#[requires(idx < self.size_hint().0)]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item
where
Self: TrustedRandomAccessNoCoerce,
Expand Down
5 changes: 5 additions & 0 deletions library/core/src/iter/traits/iterator.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use safety::requires;

use super::super::{
ArrayChunks, ByRefSized, Chain, Cloned, Copied, Cycle, Enumerate, Filter, FilterMap, FlatMap,
Flatten, Fuse, Inspect, Intersperse, IntersperseWith, Map, MapWhile, MapWindows, Peekable,
Expand All @@ -6,6 +8,8 @@ use super::super::{
};
use crate::array;
use crate::cmp::{self, Ordering};
#[cfg(kani)]
use crate::kani;
use crate::num::NonZero;
use crate::ops::{ChangeOutputType, ControlFlow, FromResidual, Residual, Try};

Expand Down Expand Up @@ -1709,6 +1713,7 @@ pub trait Iterator {
/// ```
#[inline]
#[unstable(feature = "iter_map_windows", reason = "recently added", issue = "87155")]
#[requires(N > 0)]
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where
Self: Sized,
Expand Down
6 changes: 6 additions & 0 deletions library/core/src/range/iter.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
use safety::requires;

use crate::iter::{
FusedIterator, Step, TrustedLen, TrustedRandomAccess, TrustedRandomAccessNoCoerce, TrustedStep,
};
#[cfg(kani)]
use crate::kani;
use crate::num::NonZero;
use crate::range::{Range, RangeFrom, RangeInclusive, legacy};

Expand Down Expand Up @@ -104,6 +108,8 @@ impl<A: Step> Iterator for IterRange<A> {
}

#[inline]
#[requires(idx < self.size_hint().0)]
#[cfg_attr(kani, kani::modifies(self))]
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> Self::Item
where
Self: TrustedRandomAccessNoCoerce,
Expand Down
Loading
Loading