4 #![feature(drain, collections_bound, btree_range)]
6 use std::collections::BinaryHeap;
7 use std::collections::{BTreeMap, BTreeSet};
8 use std::collections::LinkedList;
9 use std::collections::VecDeque;
10 use std::collections::HashMap;
11 use std::collections::HashSet;
14 use std::ops::Bound::Included;
16 fn is_sync<T>(_: T) where T: Sync {}
17 fn is_send<T>(_: T) where T: Send {}
19 macro_rules! all_sync_send {
20 ($ctor:expr, $($iter:ident),+) => ({
30 macro_rules! is_sync_send {
31 ($ctor:expr, $iter:ident($($param:expr),+)) => ({
33 is_sync(x.$iter($( $param ),+));
35 is_send(y.$iter($( $param ),+));
40 // The iterator "generator" list should exhaust what corresponding
41 // implementations have where `Sync` and `Send` semantics apply.
42 all_sync_send!(BinaryHeap::<usize>::new(), iter, drain, into_iter);
44 all_sync_send!(BTreeMap::<usize, usize>::new(), iter, iter_mut, into_iter, keys, values);
45 is_sync_send!(BTreeMap::<usize, usize>::new(), range((Included(&0), Included(&9))));
46 is_sync_send!(BTreeMap::<usize, usize>::new(), range_mut((Included(&0), Included(&9))));
48 all_sync_send!(BTreeSet::<usize>::new(), iter, into_iter);
49 is_sync_send!(BTreeSet::<usize>::new(), range((Included(&0), Included(&9))));
50 is_sync_send!(BTreeSet::<usize>::new(), difference(&BTreeSet::<usize>::new()));
51 is_sync_send!(BTreeSet::<usize>::new(), symmetric_difference(&BTreeSet::<usize>::new()));
52 is_sync_send!(BTreeSet::<usize>::new(), intersection(&BTreeSet::<usize>::new()));
53 is_sync_send!(BTreeSet::<usize>::new(), union(&BTreeSet::<usize>::new()));
55 all_sync_send!(HashMap::<usize, usize>::new(), iter, iter_mut, drain, into_iter, keys, values);
56 is_sync_send!(HashMap::<usize, usize>::new(), entry(0));
57 all_sync_send!(HashSet::<usize>::new(), iter, drain, into_iter);
58 is_sync_send!(HashSet::<usize>::new(), difference(&HashSet::<usize>::new()));
59 is_sync_send!(HashSet::<usize>::new(), symmetric_difference(&HashSet::<usize>::new()));
60 is_sync_send!(HashSet::<usize>::new(), intersection(&HashSet::<usize>::new()));
61 is_sync_send!(HashSet::<usize>::new(), union(&HashSet::<usize>::new()));
63 all_sync_send!(LinkedList::<usize>::new(), iter, iter_mut, into_iter);
65 all_sync_send!(VecDeque::<usize>::new(), iter, iter_mut, into_iter);
66 is_sync_send!(VecDeque::<usize>::new(), drain(..));
68 all_sync_send!(Vec::<usize>::new(), into_iter);
69 is_sync_send!(Vec::<usize>::new(), drain(..));
70 is_sync_send!(String::new(), drain(..));