about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-06-17 10:19:14 +0000
committerbors <bors@rust-lang.org>2015-06-17 10:19:14 +0000
commitd2c223a3774c011ecda7dbab231e4f4904640b5d (patch)
treeca11df7951ea01b0c844110df946c468885817f1
parentaa00f2e972e8a620f77aeb457d1d1ae4e115bcac (diff)
parent12dc01df3b8e19a6cfcb33d8e50d3741757b3f60 (diff)
downloadrust-d2c223a3774c011ecda7dbab231e4f4904640b5d.tar.gz
rust-d2c223a3774c011ecda7dbab231e4f4904640b5d.zip
Auto merge of #26126 - Nashenas88:sync-send-libcore-iter, r=huonw
This addresses an item in #22709. SizeHint in libcore/iter.rs also implements Iterator, but it's implementation is not accessible and is only used to send size hints to extend (it appears to be a performance improvement to avoid unnecessary memory reallocations). The is the only implementation of Iterator within libcore/iter.rs that is not/cannot be tested in this PR.
-rw-r--r--src/test/run-pass/sync-send-iterators-in-libcore.rs79
1 files changed, 76 insertions, 3 deletions
diff --git a/src/test/run-pass/sync-send-iterators-in-libcore.rs b/src/test/run-pass/sync-send-iterators-in-libcore.rs
index 969cf853f05..cd99b39fdd0 100644
--- a/src/test/run-pass/sync-send-iterators-in-libcore.rs
+++ b/src/test/run-pass/sync-send-iterators-in-libcore.rs
@@ -10,28 +10,101 @@
 
 // pretty-expanded FIXME #23616
 
+#![allow(unused_mut)]
+#![feature(core)]
 #![feature(collections)]
+#![feature(step_by)]
+#![feature(iter_empty)]
+#![feature(iter_once)]
+
+use std::iter::{empty, once, range_inclusive, repeat, Unfold};
 
 fn is_sync<T>(_: T) where T: Sync {}
 fn is_send<T>(_: T) where T: Send {}
 
 macro_rules! all_sync_send {
+    ($ctor:expr, $iter:ident) => ({
+        let mut x = $ctor;
+        is_sync(x.$iter());
+        let mut y = $ctor;
+        is_send(y.$iter());
+    });
+    ($ctor:expr, $iter:ident($($param:expr),+)) => ({
+        let mut x = $ctor;
+        is_sync(x.$iter($( $param ),+));
+        let mut y = $ctor;
+        is_send(y.$iter($( $param ),+));
+    });
+    ($ctor:expr, $iter:ident, $($rest:tt)*) => ({
+        all_sync_send!($ctor, $iter);
+        all_sync_send!($ctor, $($rest)*);
+    });
+    ($ctor:expr, $iter:ident($($param:expr),+), $($rest:tt)*) => ({
+        all_sync_send!($ctor, $iter($( $param ),+));
+        all_sync_send!($ctor, $($rest)*);
+    });
+}
+
+macro_rules! all_sync_send_mutable_ref {
     ($ctor:expr, $($iter:ident),+) => ({
         $(
             let mut x = $ctor;
-            is_sync(x.$iter());
+            is_sync((&mut x).$iter());
             let mut y = $ctor;
-            is_send(y.$iter());
+            is_send((&mut y).$iter());
         )+
     })
 }
 
+macro_rules! is_sync_send {
+    ($ctor:expr) => ({
+        let x = $ctor;
+        is_sync(x);
+        let y = $ctor;
+        is_send(y);
+    })
+}
+
 fn main() {
     // for char.rs
     all_sync_send!("Я", escape_default, escape_unicode);
 
     // for iter.rs
-    // FIXME
+    all_sync_send_mutable_ref!([1], iter);
+
+    // Bytes implements DoubleEndedIterator
+    all_sync_send!("a".bytes(), rev);
+
+    let a = [1];
+    let b = [2];
+    all_sync_send!(a.iter(),
+                   cloned,
+                   cycle,
+                   chain([2].iter()),
+                   zip([2].iter()),
+                   map(|_| 1),
+                   filter(|_| true),
+                   filter_map(|_| Some(1)),
+                   enumerate,
+                   peekable,
+                   skip_while(|_| true),
+                   take_while(|_| true),
+                   skip(1),
+                   take(1),
+                   scan(1, |_, _| Some(1)),
+                   flat_map(|_| b.iter()),
+                   fuse,
+                   inspect(|_| ()));
+
+    is_sync_send!(Unfold::new(Some(1), |&mut v| v));
+    is_sync_send!((1..).step_by(2));
+    is_sync_send!(range_inclusive(1, 1));
+    is_sync_send!((1..2).step_by(2));
+    is_sync_send!((1..2));
+    is_sync_send!((1..));
+    is_sync_send!(repeat(1));
+    is_sync_send!(empty::<usize>());
+    is_sync_send!(once(1));
 
     // for option.rs
     // FIXME