@@ -143,16 +143,13 @@ impl<'tcx, K: Eq + Hash, V: 'tcx> CacheSelector<K, V> for ArenaCacheSelector<'tc
143
143
}
144
144
145
145
pub struct ArenaCache < ' tcx , K , V > {
146
- arena : WorkerLocal < & ' tcx TypedArena < ( V , DepNodeIndex ) > > ,
147
- phantom : PhantomData < K > ,
146
+ arena : WorkerLocal < TypedArena < ( V , DepNodeIndex ) > > ,
147
+ phantom : PhantomData < ( K , & ' tcx V ) > ,
148
148
}
149
149
150
150
impl < ' tcx , K , V > Default for ArenaCache < ' tcx , K , V > {
151
151
fn default ( ) -> Self {
152
- ArenaCache {
153
- arena : WorkerLocal :: new ( |_| & * Box :: leak ( Box :: new ( TypedArena :: default ( ) ) ) ) ,
154
- phantom : PhantomData ,
155
- }
152
+ ArenaCache { arena : WorkerLocal :: new ( |_| TypedArena :: default ( ) ) , phantom : PhantomData }
156
153
}
157
154
}
158
155
@@ -162,7 +159,8 @@ impl<'tcx, K: Eq + Hash, V: 'tcx> QueryStorage for ArenaCache<'tcx, K, V> {
162
159
163
160
fn store_nocache ( & self , value : Self :: Value ) -> Self :: Stored {
164
161
let value = self . arena . alloc ( ( value, DepNodeIndex :: INVALID ) ) ;
165
- & value. 0
162
+ let value = unsafe { & * ( & value. 0 as * const _ ) } ;
163
+ & value
166
164
}
167
165
}
168
166
@@ -204,6 +202,7 @@ impl<'tcx, K: Eq + Hash, V: 'tcx> QueryCache for ArenaCache<'tcx, K, V> {
204
202
index : DepNodeIndex ,
205
203
) -> Self :: Stored {
206
204
let value = self . arena . alloc ( ( value, index) ) ;
205
+ let value = unsafe { & * ( value as * const _ ) } ;
207
206
lock_sharded_storage. insert ( key, value) ;
208
207
& value. 0
209
208
}
0 commit comments