1
Fork 0

Factor out conservative_is_privately_uninhabited

This commit is contained in:
Cameron Steffen 2022-10-23 17:32:40 -05:00
parent 34cbe72780
commit cc8dddbac9
11 changed files with 25 additions and 81 deletions

View file

@ -2078,17 +2078,6 @@ rustc_queries! {
desc { "normalizing opaque types in `{:?}`", key }
}
/// Checks whether a type is definitely uninhabited. This is
/// conservative: for some types that are uninhabited we return `false`,
/// but we only return `true` for types that are definitely uninhabited.
/// `ty.conservative_is_privately_uninhabited` implies that any value of type `ty`
/// will be `Abi::Uninhabited`. (Note that uninhabited types may have nonzero
/// size, to account for partial initialisation. See #49298 for details.)
query conservative_is_privately_uninhabited(key: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
desc { "conservatively checking if `{}` is privately uninhabited", key.value }
remap_env_constness
}
query limits(key: ()) -> Limits {
desc { "looking up limits" }
}

View file

@ -41,6 +41,13 @@ impl<'tcx> InhabitedPredicate<'tcx> {
self.apply_inner(tcx, param_env, &|_| Err(())).ok()
}
/// Same as `apply`, but `NotInModule(_)` predicates yield `false`. That is,
/// privately uninhabited types are considered always uninhabited.
pub fn apply_ignore_module(self, tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>) -> bool {
let Ok(result) = self.apply_inner::<!>(tcx, param_env, &|_| Ok(true));
result
}
fn apply_inner<E>(
self,
tcx: TyCtxt<'tcx>,

View file

@ -169,6 +169,15 @@ impl<'tcx> Ty<'tcx> {
) -> bool {
self.inhabited_predicate(tcx).apply(tcx, param_env, module)
}
/// Returns true if the type is uninhabited without regard to visibility
pub fn is_privately_uninhabited(
self,
tcx: TyCtxt<'tcx>,
param_env: ty::ParamEnv<'tcx>,
) -> bool {
!self.inhabited_predicate(tcx).apply_ignore_module(tcx, param_env)
}
}
/// N.B. this query should only be called through `Ty::inhabited_predicate`