• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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