diff options
| -rw-r--r-- | library/alloc/src/vec.rs | 8 | ||||
| -rw-r--r-- | library/core/src/iter/traits/marker.rs | 1 |
2 files changed, 8 insertions, 1 deletions
diff --git a/library/alloc/src/vec.rs b/library/alloc/src/vec.rs index db012762419..c0c63a27be5 100644 --- a/library/alloc/src/vec.rs +++ b/library/alloc/src/vec.rs @@ -2240,9 +2240,14 @@ fn write_in_place_with_drop<T>( } } +#[rustc_unsafe_specialization_marker] +trait SourceIterMarker: SourceIter<Source: AsIntoIter> {} + +impl<T> SourceIterMarker for T where T: SourceIter<Source: AsIntoIter> {} + impl<T, I> SpecFrom<T, I> for Vec<T> where - I: Iterator<Item = T> + InPlaceIterable + SourceIter<Source: AsIntoIter>, + I: Iterator<Item = T> + InPlaceIterable + SourceIterMarker, { default fn from_iter(mut iterator: I) -> Self { // Additional requirements which cannot expressed via trait bounds. We rely on const eval @@ -3015,6 +3020,7 @@ unsafe impl<T> SourceIter for IntoIter<T> { } // internal helper trait for in-place iteration specialization. +#[rustc_specialization_trait] pub(crate) trait AsIntoIter { type Item; fn as_into_iter(&mut self) -> &mut IntoIter<Self::Item>; diff --git a/library/core/src/iter/traits/marker.rs b/library/core/src/iter/traits/marker.rs index f287196da03..5d31e78dd85 100644 --- a/library/core/src/iter/traits/marker.rs +++ b/library/core/src/iter/traits/marker.rs @@ -53,4 +53,5 @@ unsafe impl<I: TrustedLen + ?Sized> TrustedLen for &mut I {} /// /// [`SourceIter`]: ../../std/iter/trait.SourceIter.html #[unstable(issue = "none", feature = "inplace_iteration")] +#[rustc_specialization_trait] pub unsafe trait InPlaceIterable: Iterator {} |
