]> git.lizzy.rs Git - rust.git/blob - crates/test_utils/src/minicore.rs
8f8f1c9f8b58553d085057397c98ab3d3920add2
[rust.git] / crates / test_utils / src / minicore.rs
1 //! This is a fixture we use for tests that need lang items.
2 //!
3 //! We want to include the minimal subset of core for each test, so this file
4 //! supports "conditional compilation". Tests use the following syntax to include minicore:
5 //!
6 //!  //- minicore: flag1, flag2
7 //!
8 //! We then strip all the code marked with other flags.
9 //!
10 //! Available flags:
11 //!     sized:
12 //!     unsize: sized
13 //!     coerce_unsized: unsize
14
15 pub mod marker {
16     // region:sized
17     #[lang = "sized"]
18     #[fundamental]
19     #[rustc_specialization_trait]
20     pub trait Sized {}
21     // endregion:sized
22
23     // region:unsize
24     #[lang = "unsize"]
25     pub trait Unsize<T: ?Sized> {}
26     // endregion:unsize
27 }
28
29 pub mod ops {
30     mod unsize {
31         // region:coerce_unsized
32         use crate::marker::Unsize;
33
34         #[lang = "coerce_unsized"]
35         pub trait CoerceUnsized<T: ?Sized> {}
36
37         impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a mut U> for &'a mut T {}
38         impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b mut T {}
39         impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for &'a mut T {}
40         impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for &'a mut T {}
41
42         impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b T {}
43         impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for &'a T {}
44
45         impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for *mut T {}
46         impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for *mut T {}
47         impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for *const T {}
48         // endregion:coerce_unsized
49     }
50
51     pub use self::unsize::CoerceUnsized; // :coerce_unsized
52 }
53
54 pub mod prelude {
55     pub mod v1 {
56         pub use crate::marker::Sized; // :sized
57     }
58
59     pub mod rust_2015 {
60         pub use super::v1::*;
61     }
62
63     pub mod rust_2018 {
64         pub use super::v1::*;
65     }
66
67     pub mod rust_2021 {
68         pub use super::v1::*;
69     }
70 }
71
72 #[prelude_import]
73 #[allow(unused)]
74 use prelude::v1::*;