//@ compile-flags: --edition=2021 #![feature(rustc_attrs)] use core::any::Any; use core::marker::PhantomData; fn main() { test::>>(make()); //~^ ERROR evaluate(Binder { value: TraitPredicate(> as std::marker::Sized>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk) test::>>(make()); //~^ ERROR evaluate(Binder { value: TraitPredicate(> as std::marker::Sized>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions) } #[rustc_evaluate_where_clauses] fn test(_: T) {} fn make() -> T { todo!() } struct DerefWrap(T); impl core::ops::Deref for DerefWrap { type Target = T; fn deref(&self) -> &Self::Target { &self.0 } } struct Storage { phantom: PhantomData<(T, D)>, } type ReadStorage = Storage>>; pub trait Component { type Storage; } struct VecStorage; struct Pos; impl Component for Pos { type Storage = VecStorage; } struct GenericComp { _t: T, } impl Component for GenericComp { type Storage = VecStorage; } struct GenericComp2 { _t: T, } impl Component for GenericComp2 where for<'a> &'a bool: 'a { type Storage = VecStorage; } struct ReadData { pos_interpdata: ReadStorage>, } trait System { type SystemData; fn run(data: Self::SystemData, any: Box); } struct Sys; impl System for Sys { type SystemData = (ReadData, ReadStorage); fn run((data, pos): Self::SystemData, any: Box) { > as SystemData>::setup(any); ParJoin::par_join((&pos, &data.pos_interpdata)); } } trait ParJoin { fn par_join(self) where Self: Sized, { } } impl<'a, T, D> ParJoin for &'a Storage where T: Component, D: core::ops::Deref>, T::Storage: Sync, { } impl ParJoin for (A, B) where A: ParJoin, B: ParJoin, { } pub trait SystemData { fn setup(any: Box); } impl SystemData for ReadStorage where T: Component, { fn setup(any: Box) { let storage: &MaskedStorage = any.downcast_ref().unwrap(); >>::cast(&storage); } } pub struct MaskedStorage { _inner: T::Storage, } pub unsafe trait CastFrom { fn cast(t: &T) -> &Self; } unsafe impl CastFrom for dyn Any where T: Any + 'static, { fn cast(t: &T) -> &Self { t } }