|
10 | 10 |
|
11 | 11 | // pretty-expanded FIXME #23616
|
12 | 12 |
|
| 13 | +#![allow(unused_mut)] |
| 14 | +#![feature(core)] |
13 | 15 | #![feature(collections)]
|
| 16 | +#![feature(step_by)] |
| 17 | +#![feature(iter_empty)] |
| 18 | +#![feature(iter_once)] |
| 19 | + |
| 20 | +use std::iter::{empty, once, range_inclusive, repeat, Unfold}; |
14 | 21 |
|
15 | 22 | fn is_sync<T>(_: T) where T: Sync {}
|
16 | 23 | fn is_send<T>(_: T) where T: Send {}
|
17 | 24 |
|
18 | 25 | macro_rules! all_sync_send {
|
| 26 | + ($ctor:expr, $iter:ident) => ({ |
| 27 | + let mut x = $ctor; |
| 28 | + is_sync(x.$iter()); |
| 29 | + let mut y = $ctor; |
| 30 | + is_send(y.$iter()); |
| 31 | + }); |
| 32 | + ($ctor:expr, $iter:ident($($param:expr),+)) => ({ |
| 33 | + let mut x = $ctor; |
| 34 | + is_sync(x.$iter($( $param ),+)); |
| 35 | + let mut y = $ctor; |
| 36 | + is_send(y.$iter($( $param ),+)); |
| 37 | + }); |
| 38 | + ($ctor:expr, $iter:ident, $($rest:tt)*) => ({ |
| 39 | + all_sync_send!($ctor, $iter); |
| 40 | + all_sync_send!($ctor, $($rest)*); |
| 41 | + }); |
| 42 | + ($ctor:expr, $iter:ident($($param:expr),+), $($rest:tt)*) => ({ |
| 43 | + all_sync_send!($ctor, $iter($( $param ),+)); |
| 44 | + all_sync_send!($ctor, $($rest)*); |
| 45 | + }); |
| 46 | +} |
| 47 | + |
| 48 | +macro_rules! all_sync_send_mutable_ref { |
19 | 49 | ($ctor:expr, $($iter:ident),+) => ({
|
20 | 50 | $(
|
21 | 51 | let mut x = $ctor;
|
22 |
| - is_sync(x.$iter()); |
| 52 | + is_sync((&mut x).$iter()); |
23 | 53 | let mut y = $ctor;
|
24 |
| - is_send(y.$iter()); |
| 54 | + is_send((&mut y).$iter()); |
25 | 55 | )+
|
26 | 56 | })
|
27 | 57 | }
|
28 | 58 |
|
| 59 | +macro_rules! is_sync_send { |
| 60 | + ($ctor:expr) => ({ |
| 61 | + let x = $ctor; |
| 62 | + is_sync(x); |
| 63 | + let y = $ctor; |
| 64 | + is_send(y); |
| 65 | + }) |
| 66 | +} |
| 67 | + |
29 | 68 | fn main() {
|
30 | 69 | // for char.rs
|
31 | 70 | all_sync_send!("Я", escape_default, escape_unicode);
|
32 | 71 |
|
33 | 72 | // for iter.rs
|
34 |
| - // FIXME |
| 73 | + all_sync_send_mutable_ref!([1], iter); |
| 74 | + |
| 75 | + // Bytes implements DoubleEndedIterator |
| 76 | + all_sync_send!("a".bytes(), rev); |
| 77 | + |
| 78 | + let a = [1]; |
| 79 | + let b = [2]; |
| 80 | + all_sync_send!(a.iter(), |
| 81 | + cloned, |
| 82 | + cycle, |
| 83 | + chain([2].iter()), |
| 84 | + zip([2].iter()), |
| 85 | + map(|_| 1), |
| 86 | + filter(|_| true), |
| 87 | + filter_map(|_| Some(1)), |
| 88 | + enumerate, |
| 89 | + peekable, |
| 90 | + skip_while(|_| true), |
| 91 | + take_while(|_| true), |
| 92 | + skip(1), |
| 93 | + take(1), |
| 94 | + scan(1, |_, _| Some(1)), |
| 95 | + flat_map(|_| b.iter()), |
| 96 | + fuse, |
| 97 | + inspect(|_| ())); |
| 98 | + |
| 99 | + is_sync_send!(Unfold::new(Some(1), |&mut v| v)); |
| 100 | + is_sync_send!((1..).step_by(2)); |
| 101 | + is_sync_send!(range_inclusive(1, 1)); |
| 102 | + is_sync_send!((1..2).step_by(2)); |
| 103 | + is_sync_send!((1..2)); |
| 104 | + is_sync_send!((1..)); |
| 105 | + is_sync_send!(repeat(1)); |
| 106 | + is_sync_send!(empty::<usize>()); |
| 107 | + is_sync_send!(once(1)); |
35 | 108 |
|
36 | 109 | // for option.rs
|
37 | 110 | // FIXME
|
|
0 commit comments