Skip to content

Commit 9aeea00

Browse files
committed
get things to work under min_specialization by leaning more heavily on #[rustc_unsafe_specialization_marker]
1 parent 7badb7a commit 9aeea00

File tree

3 files changed

+14
-9
lines changed

3 files changed

+14
-9
lines changed

library/alloc/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
#![feature(slice_partition_dedup)]
136136
#![feature(maybe_uninit_extra, maybe_uninit_slice)]
137137
#![feature(alloc_layout_extra)]
138+
#![feature(trusted_random_access)]
138139
#![feature(try_trait)]
139140
#![feature(type_alias_impl_trait)]
140141
#![feature(associated_type_bounds)]

library/alloc/src/vec.rs

+13-8
Original file line numberDiff line numberDiff line change
@@ -2243,11 +2243,11 @@ fn write_in_place_with_drop<T>(
22432243
#[rustc_unsafe_specialization_marker]
22442244
trait SourceIterMarker: SourceIter<Source: AsIntoIter> {}
22452245

2246-
impl<T> SourceIterMarker for T where T: SourceIter<Source: AsIntoIter> {}
2246+
impl<T> SourceIterMarker for T where T: SourceIter<Source: AsIntoIter> + InPlaceIterable {}
22472247

22482248
impl<T, I> SpecFrom<T, I> for Vec<T>
22492249
where
2250-
I: Iterator<Item = T> + InPlaceIterable + SourceIterMarker,
2250+
I: Iterator<Item = T> + SourceIterMarker,
22512251
{
22522252
default fn from_iter(mut iterator: I) -> Self {
22532253
// Additional requirements which cannot expressed via trait bounds. We rely on const eval
@@ -2920,6 +2920,17 @@ impl<T> Iterator for IntoIter<T> {
29202920
fn count(self) -> usize {
29212921
self.len()
29222922
}
2923+
2924+
unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item
2925+
where
2926+
Self: TrustedRandomAccess,
2927+
{
2928+
// SAFETY: the caller must uphold the contract for
2929+
// `Iterator::get_unchecked`.
2930+
unsafe {
2931+
if mem::size_of::<T>() == 0 { mem::zeroed() } else { ptr::read(self.ptr.add(i)) }
2932+
}
2933+
}
29232934
}
29242935

29252936
#[stable(feature = "rust1", since = "1.0.0")]
@@ -2967,12 +2978,6 @@ unsafe impl<T> TrustedRandomAccess for IntoIter<T>
29672978
where
29682979
T: Copy,
29692980
{
2970-
unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
2971-
unsafe {
2972-
if mem::size_of::<T>() == 0 { mem::zeroed() } else { ptr::read(self.ptr.add(i)) }
2973-
}
2974-
}
2975-
29762981
fn may_have_side_effect() -> bool {
29772982
false
29782983
}

library/core/src/iter/traits/marker.rs

-1
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,4 @@ unsafe impl<I: TrustedLen + ?Sized> TrustedLen for &mut I {}
5353
///
5454
/// [`SourceIter`]: ../../std/iter/trait.SourceIter.html
5555
#[unstable(issue = "none", feature = "inplace_iteration")]
56-
#[rustc_specialization_trait]
5756
pub unsafe trait InPlaceIterable: Iterator {}

0 commit comments

Comments
 (0)