• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // revisions:cfail1 cfail2
2 //[cfail1] compile-flags: --crate-type=lib --edition=2021 -Zassert-incr-state=not-loaded
3 //[cfail2] compile-flags: --crate-type=lib --edition=2021 -Zassert-incr-state=loaded
4 // build-pass
5 
6 use core::any::Any;
7 use core::marker::PhantomData;
8 
9 struct DerefWrap<T>(T);
10 
11 impl<T> core::ops::Deref for DerefWrap<T> {
12     type Target = T;
deref(&self) -> &Self::Target13     fn deref(&self) -> &Self::Target {
14         &self.0
15     }
16 }
17 
18 struct Storage<T, D> {
19     phantom: PhantomData<(T, D)>,
20 }
21 
22 type ReadStorage<T> = Storage<T, DerefWrap<MaskedStorage<T>>>;
23 
24 pub trait Component {
25     type Storage;
26 }
27 
28 struct VecStorage;
29 
30 struct Pos;
31 
32 impl Component for Pos {
33     type Storage = VecStorage;
34 }
35 
36 struct GenericComp<T> {
37     _t: T,
38 }
39 
40 impl<T: 'static> Component for GenericComp<T> {
41     type Storage = VecStorage;
42 }
43 struct ReadData {
44     pos_interpdata: ReadStorage<GenericComp<Pos>>,
45 }
46 
47 trait System {
48     type SystemData;
49 
run(data: Self::SystemData, any: Box<dyn Any>)50     fn run(data: Self::SystemData, any: Box<dyn Any>);
51 }
52 
53 struct Sys;
54 
55 impl System for Sys {
56     type SystemData = (ReadData, ReadStorage<Pos>);
57 
run((data, pos): Self::SystemData, any: Box<dyn Any>)58     fn run((data, pos): Self::SystemData, any: Box<dyn Any>) {
59         <ReadStorage<GenericComp<Pos>> as SystemData>::setup(any);
60 
61         ParJoin::par_join((&pos, &data.pos_interpdata));
62     }
63 }
64 
65 trait ParJoin {
par_join(self) where Self: Sized,66     fn par_join(self)
67     where
68         Self: Sized,
69     {
70     }
71 }
72 
73 impl<'a, T, D> ParJoin for &'a Storage<T, D>
74 where
75     T: Component,
76     D: core::ops::Deref<Target = MaskedStorage<T>>,
77     T::Storage: Sync,
78 {
79 }
80 
81 impl<A, B> ParJoin for (A, B)
82 where
83     A: ParJoin,
84     B: ParJoin,
85 {
86 }
87 
88 pub trait SystemData {
setup(any: Box<dyn Any>)89     fn setup(any: Box<dyn Any>);
90 }
91 
92 impl<T: 'static> SystemData for ReadStorage<T>
93 where
94     T: Component,
95 {
setup(any: Box<dyn Any>)96     fn setup(any: Box<dyn Any>) {
97         let storage: &MaskedStorage<T> = any.downcast_ref().unwrap();
98 
99         <dyn Any as CastFrom<MaskedStorage<T>>>::cast(&storage);
100     }
101 }
102 
103 pub struct MaskedStorage<T: Component> {
104     _inner: T::Storage,
105 }
106 
107 pub unsafe trait CastFrom<T> {
cast(t: &T) -> &Self108     fn cast(t: &T) -> &Self;
109 }
110 
111 unsafe impl<T> CastFrom<T> for dyn Any
112 where
113     T: Any + 'static,
114 {
cast(t: &T) -> &Self115     fn cast(t: &T) -> &Self {
116         t
117     }
118 }
119