17ac06127Sopenharmony_ci#![allow(clippy::extra_unused_type_parameters)]
27ac06127Sopenharmony_ci
37ac06127Sopenharmony_ciuse proc_macro2::{
47ac06127Sopenharmony_ci    Delimiter, Group, Ident, LexError, Literal, Punct, Spacing, Span, TokenStream, TokenTree,
57ac06127Sopenharmony_ci};
67ac06127Sopenharmony_ci
77ac06127Sopenharmony_cimacro_rules! assert_impl {
87ac06127Sopenharmony_ci    ($ty:ident is $($marker:ident) and +) => {
97ac06127Sopenharmony_ci        #[test]
107ac06127Sopenharmony_ci        #[allow(non_snake_case)]
117ac06127Sopenharmony_ci        fn $ty() {
127ac06127Sopenharmony_ci            fn assert_implemented<T: $($marker +)+>() {}
137ac06127Sopenharmony_ci            assert_implemented::<$ty>();
147ac06127Sopenharmony_ci        }
157ac06127Sopenharmony_ci    };
167ac06127Sopenharmony_ci
177ac06127Sopenharmony_ci    ($ty:ident is not $($marker:ident) or +) => {
187ac06127Sopenharmony_ci        #[test]
197ac06127Sopenharmony_ci        #[allow(non_snake_case)]
207ac06127Sopenharmony_ci        fn $ty() {
217ac06127Sopenharmony_ci            $(
227ac06127Sopenharmony_ci                {
237ac06127Sopenharmony_ci                    // Implemented for types that implement $marker.
247ac06127Sopenharmony_ci                    trait IsNotImplemented {
257ac06127Sopenharmony_ci                        fn assert_not_implemented() {}
267ac06127Sopenharmony_ci                    }
277ac06127Sopenharmony_ci                    impl<T: $marker> IsNotImplemented for T {}
287ac06127Sopenharmony_ci
297ac06127Sopenharmony_ci                    // Implemented for the type being tested.
307ac06127Sopenharmony_ci                    trait IsImplemented {
317ac06127Sopenharmony_ci                        fn assert_not_implemented() {}
327ac06127Sopenharmony_ci                    }
337ac06127Sopenharmony_ci                    impl IsImplemented for $ty {}
347ac06127Sopenharmony_ci
357ac06127Sopenharmony_ci                    // If $ty does not implement $marker, there is no ambiguity
367ac06127Sopenharmony_ci                    // in the following trait method call.
377ac06127Sopenharmony_ci                    <$ty>::assert_not_implemented();
387ac06127Sopenharmony_ci                }
397ac06127Sopenharmony_ci            )+
407ac06127Sopenharmony_ci        }
417ac06127Sopenharmony_ci    };
427ac06127Sopenharmony_ci}
437ac06127Sopenharmony_ci
447ac06127Sopenharmony_ciassert_impl!(Delimiter is Send and Sync);
457ac06127Sopenharmony_ciassert_impl!(Spacing is Send and Sync);
467ac06127Sopenharmony_ci
477ac06127Sopenharmony_ciassert_impl!(Group is not Send or Sync);
487ac06127Sopenharmony_ciassert_impl!(Ident is not Send or Sync);
497ac06127Sopenharmony_ciassert_impl!(LexError is not Send or Sync);
507ac06127Sopenharmony_ciassert_impl!(Literal is not Send or Sync);
517ac06127Sopenharmony_ciassert_impl!(Punct is not Send or Sync);
527ac06127Sopenharmony_ciassert_impl!(Span is not Send or Sync);
537ac06127Sopenharmony_ciassert_impl!(TokenStream is not Send or Sync);
547ac06127Sopenharmony_ciassert_impl!(TokenTree is not Send or Sync);
557ac06127Sopenharmony_ci
567ac06127Sopenharmony_ci#[cfg(procmacro2_semver_exempt)]
577ac06127Sopenharmony_cimod semver_exempt {
587ac06127Sopenharmony_ci    use proc_macro2::{LineColumn, SourceFile};
597ac06127Sopenharmony_ci
607ac06127Sopenharmony_ci    assert_impl!(LineColumn is Send and Sync);
617ac06127Sopenharmony_ci
627ac06127Sopenharmony_ci    assert_impl!(SourceFile is not Send or Sync);
637ac06127Sopenharmony_ci}
647ac06127Sopenharmony_ci
657ac06127Sopenharmony_cimod unwind_safe {
667ac06127Sopenharmony_ci    use proc_macro2::{
677ac06127Sopenharmony_ci        Delimiter, Group, Ident, LexError, Literal, Punct, Spacing, Span, TokenStream, TokenTree,
687ac06127Sopenharmony_ci    };
697ac06127Sopenharmony_ci    #[cfg(procmacro2_semver_exempt)]
707ac06127Sopenharmony_ci    use proc_macro2::{LineColumn, SourceFile};
717ac06127Sopenharmony_ci    use std::panic::{RefUnwindSafe, UnwindSafe};
727ac06127Sopenharmony_ci
737ac06127Sopenharmony_ci    macro_rules! assert_unwind_safe {
747ac06127Sopenharmony_ci        ($($types:ident)*) => {
757ac06127Sopenharmony_ci            $(
767ac06127Sopenharmony_ci                assert_impl!($types is UnwindSafe and RefUnwindSafe);
777ac06127Sopenharmony_ci            )*
787ac06127Sopenharmony_ci        };
797ac06127Sopenharmony_ci    }
807ac06127Sopenharmony_ci
817ac06127Sopenharmony_ci    assert_unwind_safe! {
827ac06127Sopenharmony_ci        Delimiter
837ac06127Sopenharmony_ci        Group
847ac06127Sopenharmony_ci        Ident
857ac06127Sopenharmony_ci        LexError
867ac06127Sopenharmony_ci        Literal
877ac06127Sopenharmony_ci        Punct
887ac06127Sopenharmony_ci        Spacing
897ac06127Sopenharmony_ci        Span
907ac06127Sopenharmony_ci        TokenStream
917ac06127Sopenharmony_ci        TokenTree
927ac06127Sopenharmony_ci    }
937ac06127Sopenharmony_ci
947ac06127Sopenharmony_ci    #[cfg(procmacro2_semver_exempt)]
957ac06127Sopenharmony_ci    assert_unwind_safe! {
967ac06127Sopenharmony_ci        LineColumn
977ac06127Sopenharmony_ci        SourceFile
987ac06127Sopenharmony_ci    }
997ac06127Sopenharmony_ci}
100