1 // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 // pretty-expanded FIXME #23616
14 #![feature(iter_empty)]
15 #![feature(iter_once)]
16 #![feature(iter_unfold)]
17 #![feature(range_inclusive)]
19 #![feature(str_escape)]
21 use std::iter::{empty, once, range_inclusive, repeat};
23 fn is_sync<T>(_: T) where T: Sync {}
24 fn is_send<T>(_: T) where T: Send {}
26 macro_rules! all_sync_send {
27 ($ctor:expr, $iter:ident) => ({
33 ($ctor:expr, $iter:ident($($param:expr),+)) => ({
35 is_sync(x.$iter($( $param ),+));
37 is_send(y.$iter($( $param ),+));
39 ($ctor:expr, $iter:ident, $($rest:tt)*) => ({
40 all_sync_send!($ctor, $iter);
41 all_sync_send!($ctor, $($rest)*);
43 ($ctor:expr, $iter:ident($($param:expr),+), $($rest:tt)*) => ({
44 all_sync_send!($ctor, $iter($( $param ),+));
45 all_sync_send!($ctor, $($rest)*);
49 macro_rules! all_sync_send_mutable_ref {
50 ($ctor:expr, $($iter:ident),+) => ({
53 is_sync((&mut x).$iter());
55 is_send((&mut y).$iter());
60 macro_rules! is_sync_send {
71 all_sync_send!("Я", escape_default, escape_unicode);
74 all_sync_send_mutable_ref!([1], iter);
76 // Bytes implements DoubleEndedIterator
77 all_sync_send!("a".bytes(), rev);
81 all_sync_send!(a.iter(),
88 filter_map(|_| Some(1)),
95 scan(1, |_, _| Some(1)),
96 flat_map(|_| b.iter()),
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));