about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--library/alloc/src/vec.rs8
-rw-r--r--library/core/src/iter/traits/marker.rs1
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 {}