diff options
| author | Caleb Sander <caleb.sander@gmail.com> | 2021-10-20 17:04:01 -0700 |
|---|---|---|
| committer | Caleb Sander <caleb.sander@gmail.com> | 2021-10-21 21:25:59 -0700 |
| commit | afcee19d88658e54f4a3c82892ba6d937e0f78d4 (patch) | |
| tree | f0b3676e2dfdbbea4b13dce145f9723d44efc803 | |
| parent | efd0483949496b067cd5f7569d1b28cd3d5d3c72 (diff) | |
| download | rust-afcee19d88658e54f4a3c82892ba6d937e0f78d4.tar.gz rust-afcee19d88658e54f4a3c82892ba6d937e0f78d4.zip | |
Make RSplit<T, P>: Clone not require T: Clone
This addresses a TODO comment. The behavior of #[derive(Clone)] *does* result in a T: Clone requirement. Add a manual Clone implementation, matching Split and SplitInclusive.
| -rw-r--r-- | library/core/src/slice/iter.rs | 12 | ||||
| -rw-r--r-- | src/test/ui/iterators/rsplit-clone.rs | 11 |
2 files changed, 22 insertions, 1 deletions
diff --git a/library/core/src/slice/iter.rs b/library/core/src/slice/iter.rs index dbf97851b03..07ecae78303 100644 --- a/library/core/src/slice/iter.rs +++ b/library/core/src/slice/iter.rs @@ -839,7 +839,6 @@ impl<T, P> FusedIterator for SplitInclusiveMut<'_, T, P> where P: FnMut(&T) -> b /// [`rsplit`]: slice::rsplit /// [slices]: slice #[stable(feature = "slice_rsplit", since = "1.27.0")] -#[derive(Clone)] // Is this correct, or does it incorrectly require `T: Clone`? pub struct RSplit<'a, T: 'a, P> where P: FnMut(&T) -> bool, @@ -867,6 +866,17 @@ where } } +// FIXME(#26925) Remove in favor of `#[derive(Clone)]` +#[stable(feature = "slice_rsplit", since = "1.27.0")] +impl<T, P> Clone for RSplit<'_, T, P> +where + P: Clone + FnMut(&T) -> bool, +{ + fn clone(&self) -> Self { + RSplit { inner: self.inner.clone() } + } +} + #[stable(feature = "slice_rsplit", since = "1.27.0")] impl<'a, T, P> Iterator for RSplit<'a, T, P> where diff --git a/src/test/ui/iterators/rsplit-clone.rs b/src/test/ui/iterators/rsplit-clone.rs new file mode 100644 index 00000000000..911da742957 --- /dev/null +++ b/src/test/ui/iterators/rsplit-clone.rs @@ -0,0 +1,11 @@ +// check-pass + +// RSplit<T, P> previously required T: Clone in order to be Clone + +struct NotClone; + +fn main() { + let elements = [NotClone, NotClone, NotClone]; + let rsplit = elements.rsplit(|_| false); + rsplit.clone(); +} |
