| use crate::layout; |
| |
| /// Context necessary to answer the question "Are these types transmutable?". |
| pub(crate) trait QueryContext { |
| type Def: layout::Def; |
| type Region: layout::Region; |
| type Type: layout::Type; |
| } |
| |
| #[cfg(test)] |
| pub(crate) mod test { |
| use std::marker::PhantomData; |
| |
| use super::QueryContext; |
| |
| pub(crate) struct UltraMinimal<R = !, T = !>(PhantomData<(R, T)>); |
| |
| impl<R, T> Default for UltraMinimal<R, T> { |
| fn default() -> Self { |
| Self(PhantomData) |
| } |
| } |
| |
| #[derive(Debug, Hash, Eq, PartialEq, Clone, Copy)] |
| pub(crate) enum Def { |
| HasSafetyInvariants, |
| NoSafetyInvariants, |
| } |
| |
| impl crate::layout::Def for Def { |
| fn has_safety_invariants(&self) -> bool { |
| self == &Self::HasSafetyInvariants |
| } |
| } |
| |
| impl<R, T> QueryContext for UltraMinimal<R, T> |
| where |
| R: crate::layout::Region, |
| T: crate::layout::Type, |
| { |
| type Def = Def; |
| type Region = R; |
| type Type = T; |
| } |
| } |
| |
| #[cfg(feature = "rustc")] |
| mod rustc { |
| use rustc_middle::ty::{Region, Ty, TyCtxt}; |
| |
| use super::*; |
| |
| impl<'tcx> super::QueryContext for TyCtxt<'tcx> { |
| type Def = layout::rustc::Def<'tcx>; |
| type Region = Region<'tcx>; |
| type Type = Ty<'tcx>; |
| } |
| } |