]> git.lizzy.rs Git - rust.git/blob - src/test/ui/threads-sendsync/sync-send-iterators-in-libcollections.rs
Auto merge of #84589 - In-line:zircon-thread-name, r=JohnTitor
[rust.git] / src / test / ui / threads-sendsync / sync-send-iterators-in-libcollections.rs
1 // run-pass
2
3 #![allow(warnings)]
4 #![feature(drain, collections_bound, btree_range)]
5
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;
12
13 use std::mem;
14 use std::ops::Bound::Included;
15
16 fn is_sync<T>(_: T) where T: Sync {}
17 fn is_send<T>(_: T) where T: Send {}
18
19 macro_rules! all_sync_send {
20     ($ctor:expr, $($iter:ident),+) => ({
21         $(
22             let mut x = $ctor;
23             is_sync(x.$iter());
24             let mut y = $ctor;
25             is_send(y.$iter());
26         )+
27     })
28 }
29
30 macro_rules! is_sync_send {
31     ($ctor:expr, $iter:ident($($param:expr),+)) => ({
32         let mut x = $ctor;
33         is_sync(x.$iter($( $param ),+));
34         let mut y = $ctor;
35         is_send(y.$iter($( $param ),+));
36     })
37 }
38
39 fn main() {
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);
43
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))));
47
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()));
54
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()));
62
63     all_sync_send!(LinkedList::<usize>::new(), iter, iter_mut, into_iter);
64
65     all_sync_send!(VecDeque::<usize>::new(), iter, iter_mut, into_iter);
66     is_sync_send!(VecDeque::<usize>::new(), drain(..));
67
68     all_sync_send!(Vec::<usize>::new(), into_iter);
69     is_sync_send!(Vec::<usize>::new(), drain(..));
70     is_sync_send!(String::new(), drain(..));
71 }