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