1 #![no_std] 2 #![deny(unsafe_code)] 3 4 #[macro_use] 5 extern crate static_assertions; 6 7 use core::ops::Range; 8 9 trait Tri<A: ?Sized, B: ?Sized, C: ?Sized> {} 10 11 impl<T, A: ?Sized, B: ?Sized, C: ?Sized> Tri<A, B, C> for T {} 12 13 assert_impl_all!( 14 u64: Tri<[&'static u8], dyn Tri<dyn Send, dyn Sync, str>, (u16, u16)> 15 ); 16 assert_impl_all!(u8: Send, Sync); 17 assert_impl_all!(&'static [u8]: IntoIterator<Item=&'static u8>); 18 assert_impl_all!(Range<u8>: Iterator<Item=u8>); 19 assert_impl_all!([u8]: Send, Sync, AsRef<[u8]>); 20 assert_impl_all!(str: Send, Sync, AsRef<[u8]>,); 21 22 assert_impl_any!((): Send, Sync); 23 assert_impl_any!((): Send, From<u8>); 24 assert_impl_any!((): From<u8>, From<u16>, Send); 25 26 #[allow(dead_code)] 27 struct Foo; 28 29 trait A {} 30 trait B {} 31 trait C {} 32 33 impl B for Foo {} 34 35 assert_impl_one!(Foo: A, B); 36 assert_impl_one!(Foo: B, A); 37 assert_impl_one!(Foo: B, C); 38 assert_impl_one!(Foo: C, B); 39 assert_impl_one!(Foo: A, B, C); 40 assert_impl_one!(Foo: B, C, A); 41 assert_impl_one!(Foo: C, A, B); 42 43 #[derive(Clone)] 44 struct Test; 45 46 assert_impl!(u8: (From<u16>) | (Into<u16>)); 47 assert_impl!((): (From<u8>) | (From<u16>) | Send); 48 assert_impl!((): (!From<u8>) & !(From<u16>) & Send); 49 assert_impl!((): Copy | Clone); 50 assert_impl!((): Copy & Clone); 51 assert_impl!(Test: Copy | Clone); 52 assert_impl!(Test: !Copy | Clone); 53 assert_impl!(Test: !Copy & Clone); 54 assert_impl!(Test: !Copy & (Clone)); 55 assert_impl!(Test: !(Copy) & Clone); 56 assert_impl!(Test: !(!Clone)); 57 assert_impl!(Test: !(Copy) & !(!Clone)); 58 assert_impl!(Test: !(Copy & Clone)); 59 assert_impl!(str: !Copy & !Clone); 60 61 #[derive(Clone)] 62 struct Box<T>(T); 63 64 assert_impl!(for(T: Clone) Box<T>: Clone); 65 assert_impl!(for(T: Clone + Send) Box<T>: Clone & Send); 66 assert_impl!(for(T) Box<T>: (From<T>) & (Into<T>)); 67 68 assert_impl!(for(T) PhantomData<T>: Clone); 69 assert_impl!(for(T: Copy) T: Clone); 70 assert_impl!(for(T: ?Sized) T: Clone | !Clone); 71 assert_impl!(for('a, T: 'a) &'a mut T: !Copy); 72