]> git.lizzy.rs Git - rust.git/blob - crates/test_utils/src/minicore.rs
a61459f6d9318f66b63774f7b062ac64b391a2f7
[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 //!     slice:
13 //!     unsize: sized
14 //!     deref: sized
15 //!     coerce_unsized: unsize
16
17 pub mod marker {
18     // region:sized
19     #[lang = "sized"]
20     #[fundamental]
21     #[rustc_specialization_trait]
22     pub trait Sized {}
23     // endregion:sized
24
25     // region:unsize
26     #[lang = "unsize"]
27     pub trait Unsize<T: ?Sized> {}
28     // endregion:unsize
29 }
30
31 pub mod ops {
32     // region:coerce_unsized
33     mod unsize {
34         use crate::marker::Unsize;
35
36         #[lang = "coerce_unsized"]
37         pub trait CoerceUnsized<T: ?Sized> {}
38
39         impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a mut U> for &'a mut T {}
40         impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b mut T {}
41         impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for &'a mut T {}
42         impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for &'a mut T {}
43
44         impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b T {}
45         impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for &'a T {}
46
47         impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for *mut T {}
48         impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for *mut T {}
49         impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for *const T {}
50     }
51     pub use self::unsize::CoerceUnsized;
52     // endregion:coerce_unsized
53
54     // region:deref
55     mod deref {
56         #[lang = "deref"]
57         pub trait Deref {
58             #[lang = "deref_target"]
59             type Target: ?Sized;
60             fn deref(&self) -> &Self::Target;
61         }
62     }
63     pub use self::deref::Deref;
64     // endregion:deref
65 }
66
67 // region:slice
68 pub mod slice {
69     #[lang = "slice"]
70     impl<T> [T] {
71         pub fn len(&self) -> usize { loop {} }
72     }
73 }
74 // endregion:slice
75
76 pub mod prelude {
77     pub mod v1 {
78         pub use crate::marker::Sized; // :sized
79     }
80
81     pub mod rust_2015 {
82         pub use super::v1::*;
83     }
84
85     pub mod rust_2018 {
86         pub use super::v1::*;
87     }
88
89     pub mod rust_2021 {
90         pub use super::v1::*;
91     }
92 }
93
94 #[prelude_import]
95 #[allow(unused)]
96 use prelude::v1::*;