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.
This commit is contained in:
parent
efd0483949
commit
afcee19d88
@ -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
|
||||
|
11
src/test/ui/iterators/rsplit-clone.rs
Normal file
11
src/test/ui/iterators/rsplit-clone.rs
Normal file
@ -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();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user