1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
//@ run-pass
#![allow(warnings)]
use std::iter::{empty, once, repeat};
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((&mut x).$iter());
let mut y = $ctor;
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_debug, escape_default, escape_unicode);
// for iter.rs
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!((1..).step_by(2));
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!(empty::<*mut i32>());
is_sync_send!(once(1));
// for option.rs
// FIXME
// for result.rs
// FIXME
// for slice.rs
// FIXME
// for str/mod.rs
// FIXME
}
|