mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // run-pass
 | |
| // pretty-expanded FIXME #23616
 | |
| 
 | |
| #![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
 | |
| }
 | 
