|
29 | 29 | //! } |
30 | 30 | //! ``` |
31 | 31 | //! In this code, the type `Foo` will only be visibly uninhabited inside the |
32 | | -//! modules `b`, `c` and `d`. Calling `uninhabited_predicate` on `Foo` will |
| 32 | +//! modules `b`, `c` and `d`. Calling `inhabited_predicate` on `Foo` will |
33 | 33 | //! return `NotInModule(b) AND NotInModule(c)`. |
34 | 34 | //! |
35 | 35 | //! We need this information for pattern-matching on `Foo` or types that contain |
@@ -57,57 +57,6 @@ pub(crate) fn provide(providers: &mut ty::query::Providers) { |
57 | 57 | ty::query::Providers { inhabited_predicate_adt, inhabited_predicate_type, ..*providers }; |
58 | 58 | } |
59 | 59 |
|
60 | | -impl<'tcx> TyCtxt<'tcx> { |
61 | | - /// Checks whether a type is visibly uninhabited from a particular module. |
62 | | - /// |
63 | | - /// # Example |
64 | | - /// ``` |
65 | | - /// #![feature(never_type)] |
66 | | - /// # fn main() {} |
67 | | - /// enum Void {} |
68 | | - /// mod a { |
69 | | - /// pub mod b { |
70 | | - /// pub struct SecretlyUninhabited { |
71 | | - /// _priv: !, |
72 | | - /// } |
73 | | - /// } |
74 | | - /// } |
75 | | - /// |
76 | | - /// mod c { |
77 | | - /// use super::Void; |
78 | | - /// pub struct AlsoSecretlyUninhabited { |
79 | | - /// _priv: Void, |
80 | | - /// } |
81 | | - /// mod d { |
82 | | - /// } |
83 | | - /// } |
84 | | - /// |
85 | | - /// struct Foo { |
86 | | - /// x: a::b::SecretlyUninhabited, |
87 | | - /// y: c::AlsoSecretlyUninhabited, |
88 | | - /// } |
89 | | - /// ``` |
90 | | - /// In this code, the type `Foo` will only be visibly uninhabited inside the |
91 | | - /// modules b, c and d. This effects pattern-matching on `Foo` or types that |
92 | | - /// contain `Foo`. |
93 | | - /// |
94 | | - /// # Example |
95 | | - /// ```ignore (illustrative) |
96 | | - /// let foo_result: Result<T, Foo> = ... ; |
97 | | - /// let Ok(t) = foo_result; |
98 | | - /// ``` |
99 | | - /// This code should only compile in modules where the uninhabitedness of Foo is |
100 | | - /// visible. |
101 | | - pub fn is_ty_uninhabited_from( |
102 | | - self, |
103 | | - module: DefId, |
104 | | - ty: Ty<'tcx>, |
105 | | - param_env: ty::ParamEnv<'tcx>, |
106 | | - ) -> bool { |
107 | | - !ty.inhabited_predicate(self).apply(self, param_env, module) |
108 | | - } |
109 | | -} |
110 | | - |
111 | 60 | /// Returns an `InhabitedPredicate` that is generic over type parameters and |
112 | 61 | /// requires calling [`InhabitedPredicate::subst`] |
113 | 62 | fn inhabited_predicate_adt(tcx: TyCtxt<'_>, def_id: DefId) -> InhabitedPredicate<'_> { |
@@ -171,6 +120,64 @@ impl<'tcx> Ty<'tcx> { |
171 | 120 | _ => InhabitedPredicate::True, |
172 | 121 | } |
173 | 122 | } |
| 123 | + |
| 124 | + /// Checks whether a type is visibly uninhabited from a particular module. |
| 125 | + /// |
| 126 | + /// # Example |
| 127 | + /// ``` |
| 128 | + /// #![feature(never_type)] |
| 129 | + /// # fn main() {} |
| 130 | + /// enum Void {} |
| 131 | + /// mod a { |
| 132 | + /// pub mod b { |
| 133 | + /// pub struct SecretlyUninhabited { |
| 134 | + /// _priv: !, |
| 135 | + /// } |
| 136 | + /// } |
| 137 | + /// } |
| 138 | + /// |
| 139 | + /// mod c { |
| 140 | + /// use super::Void; |
| 141 | + /// pub struct AlsoSecretlyUninhabited { |
| 142 | + /// _priv: Void, |
| 143 | + /// } |
| 144 | + /// mod d { |
| 145 | + /// } |
| 146 | + /// } |
| 147 | + /// |
| 148 | + /// struct Foo { |
| 149 | + /// x: a::b::SecretlyUninhabited, |
| 150 | + /// y: c::AlsoSecretlyUninhabited, |
| 151 | + /// } |
| 152 | + /// ``` |
| 153 | + /// In this code, the type `Foo` will only be visibly uninhabited inside the |
| 154 | + /// modules b, c and d. This effects pattern-matching on `Foo` or types that |
| 155 | + /// contain `Foo`. |
| 156 | + /// |
| 157 | + /// # Example |
| 158 | + /// ```ignore (illustrative) |
| 159 | + /// let foo_result: Result<T, Foo> = ... ; |
| 160 | + /// let Ok(t) = foo_result; |
| 161 | + /// ``` |
| 162 | + /// This code should only compile in modules where the uninhabitedness of Foo is |
| 163 | + /// visible. |
| 164 | + pub fn is_inhabited_from( |
| 165 | + self, |
| 166 | + tcx: TyCtxt<'tcx>, |
| 167 | + module: DefId, |
| 168 | + param_env: ty::ParamEnv<'tcx>, |
| 169 | + ) -> bool { |
| 170 | + self.inhabited_predicate(tcx).apply(tcx, param_env, module) |
| 171 | + } |
| 172 | + |
| 173 | + /// Returns true if the type is uninhabited without regard to visibility |
| 174 | + pub fn is_privately_uninhabited( |
| 175 | + self, |
| 176 | + tcx: TyCtxt<'tcx>, |
| 177 | + param_env: ty::ParamEnv<'tcx>, |
| 178 | + ) -> bool { |
| 179 | + !self.inhabited_predicate(tcx).apply_ignore_module(tcx, param_env) |
| 180 | + } |
174 | 181 | } |
175 | 182 |
|
176 | 183 | /// N.B. this query should only be called through `Ty::inhabited_predicate` |
|
0 commit comments