Skip to content

Commit fabd772

Browse files
committed
Remove TrustedRandomAccess specialization for Cloned<T: Copy>
For incorrect Clone implementations, this exposes specialization.
1 parent 5f60208 commit fabd772

File tree

2 files changed

+21
-16
lines changed

2 files changed

+21
-16
lines changed

src/libcore/iter/adapters/mod.rs

+2-16
Original file line numberDiff line numberDiff line change
@@ -314,27 +314,13 @@ impl<'a, I, T: 'a> FusedIterator for Cloned<I>
314314
#[doc(hidden)]
315315
unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
316316
where I: TrustedRandomAccess<Item=&'a T>, T: Clone
317-
{
318-
default unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
319-
self.it.get_unchecked(i).clone()
320-
}
321-
322-
#[inline]
323-
default fn may_have_side_effect() -> bool { true }
324-
}
325-
326-
#[doc(hidden)]
327-
unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
328-
where I: TrustedRandomAccess<Item=&'a T>, T: Copy
329317
{
330318
unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
331-
*self.it.get_unchecked(i)
319+
self.it.get_unchecked(i).clone()
332320
}
333321

334322
#[inline]
335-
fn may_have_side_effect() -> bool {
336-
I::may_have_side_effect()
337-
}
323+
fn may_have_side_effect() -> bool { true }
338324
}
339325

340326
#[unstable(feature = "trusted_len", issue = "37572")]

src/libcore/tests/iter.rs

+19
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use core::cell::Cell;
22
use core::iter::*;
33
use core::{i8, i16, isize};
4+
use core::sync::atomic::{AtomicUsize, Ordering};
45
use core::usize;
56

67
#[test]
@@ -1305,6 +1306,24 @@ fn test_cloned_side_effects() {
13051306
assert_eq!(count, 2);
13061307
}
13071308

1309+
#[test]
1310+
fn test_cloned_side_effects_with_incorrect_clone_implementation() {
1311+
#[derive(Copy)]
1312+
struct X;
1313+
1314+
static CALL_COUNT: AtomicUsize = AtomicUsize::new(0);
1315+
1316+
impl Clone for X {
1317+
fn clone(&self) -> X {
1318+
CALL_COUNT.store(CALL_COUNT.load(Ordering::Relaxed) + 1, Ordering::Relaxed);
1319+
X
1320+
}
1321+
}
1322+
1323+
for _ in [X; 3].iter().cloned().zip(&[1]) {}
1324+
assert_eq!(CALL_COUNT.load(Ordering::Relaxed), 2);
1325+
}
1326+
13081327
#[test]
13091328
fn test_double_ended_map() {
13101329
let xs = [1, 2, 3, 4, 5, 6];

0 commit comments

Comments
 (0)