1 extern crate proc_macro2;
2 
3 use proc_macro2::*;
4 
5 macro_rules! assert_impl {
6     ($ty:ident is $($marker:ident) and +) => {
7         #[test]
8         #[allow(non_snake_case)]
9         fn $ty() {
10             fn assert_implemented<T: $($marker +)+>() {}
11             assert_implemented::<$ty>();
12         }
13     };
14 
15     ($ty:ident is not $($marker:ident) or +) => {
16         #[test]
17         #[allow(non_snake_case)]
18         fn $ty() {
19             $(
20                 {
21                     // Implemented for types that implement $marker.
22                     trait IsNotImplemented {
23                         fn assert_not_implemented() {}
24                     }
25                     impl<T: $marker> IsNotImplemented for T {}
26 
27                     // Implemented for the type being tested.
28                     trait IsImplemented {
29                         fn assert_not_implemented() {}
30                     }
31                     impl IsImplemented for $ty {}
32 
33                     // If $ty does not implement $marker, there is no ambiguity
34                     // in the following trait method call.
35                     <$ty>::assert_not_implemented();
36                 }
37             )+
38         }
39     };
40 }
41 
42 assert_impl!(Delimiter is Send and Sync);
43 assert_impl!(Spacing is Send and Sync);
44 
45 assert_impl!(Group is not Send or Sync);
46 assert_impl!(Ident is not Send or Sync);
47 assert_impl!(LexError is not Send or Sync);
48 assert_impl!(Literal is not Send or Sync);
49 assert_impl!(Punct is not Send or Sync);
50 assert_impl!(Span is not Send or Sync);
51 assert_impl!(TokenStream is not Send or Sync);
52 assert_impl!(TokenTree is not Send or Sync);
53 
54 #[cfg(procmacro2_semver_exempt)]
55 mod semver_exempt {
56     use super::*;
57 
58     assert_impl!(LineColumn is Send and Sync);
59 
60     assert_impl!(SourceFile is not Send or Sync);
61 }
62