• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![allow(clippy::extra_unused_type_parameters)]
2 
3 use proc_macro2::{
4     Delimiter, Group, Ident, LexError, Literal, Punct, Spacing, Span, TokenStream, TokenTree,
5 };
6 
7 macro_rules! assert_impl {
8     ($ty:ident is $($marker:ident) and +) => {
9         #[test]
10         #[allow(non_snake_case)]
11         fn $ty() {
12             fn assert_implemented<T: $($marker +)+>() {}
13             assert_implemented::<$ty>();
14         }
15     };
16 
17     ($ty:ident is not $($marker:ident) or +) => {
18         #[test]
19         #[allow(non_snake_case)]
20         fn $ty() {
21             $(
22                 {
23                     // Implemented for types that implement $marker.
24                     trait IsNotImplemented {
25                         fn assert_not_implemented() {}
26                     }
27                     impl<T: $marker> IsNotImplemented for T {}
28 
29                     // Implemented for the type being tested.
30                     trait IsImplemented {
31                         fn assert_not_implemented() {}
32                     }
33                     impl IsImplemented for $ty {}
34 
35                     // If $ty does not implement $marker, there is no ambiguity
36                     // in the following trait method call.
37                     <$ty>::assert_not_implemented();
38                 }
39             )+
40         }
41     };
42 }
43 
44 assert_impl!(Delimiter is Send and Sync);
45 assert_impl!(Spacing is Send and Sync);
46 
47 assert_impl!(Group is not Send or Sync);
48 assert_impl!(Ident is not Send or Sync);
49 assert_impl!(LexError is not Send or Sync);
50 assert_impl!(Literal is not Send or Sync);
51 assert_impl!(Punct is not Send or Sync);
52 assert_impl!(Span is not Send or Sync);
53 assert_impl!(TokenStream is not Send or Sync);
54 assert_impl!(TokenTree is not Send or Sync);
55 
56 #[cfg(procmacro2_semver_exempt)]
57 mod semver_exempt {
58     use proc_macro2::{LineColumn, SourceFile};
59 
60     assert_impl!(LineColumn is Send and Sync);
61 
62     assert_impl!(SourceFile is not Send or Sync);
63 }
64 
65 mod unwind_safe {
66     use proc_macro2::{
67         Delimiter, Group, Ident, LexError, Literal, Punct, Spacing, Span, TokenStream, TokenTree,
68     };
69     #[cfg(procmacro2_semver_exempt)]
70     use proc_macro2::{LineColumn, SourceFile};
71     use std::panic::{RefUnwindSafe, UnwindSafe};
72 
73     macro_rules! assert_unwind_safe {
74         ($($types:ident)*) => {
75             $(
76                 assert_impl!($types is UnwindSafe and RefUnwindSafe);
77             )*
78         };
79     }
80 
81     assert_unwind_safe! {
82         Delimiter
83         Group
84         Ident
85         LexError
86         Literal
87         Punct
88         Spacing
89         Span
90         TokenStream
91         TokenTree
92     }
93 
94     #[cfg(procmacro2_semver_exempt)]
95     assert_unwind_safe! {
96         LineColumn
97         SourceFile
98     }
99 }
100