@@ -64,6 +64,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
64
64
self . write_immediate ( * res, dest) ?;
65
65
}
66
66
67
+ CastKind :: PtrToMetadata => {
68
+ let src = self . read_immediate ( src) ?;
69
+ let res = self . ptr_to_metadata ( & src, cast_layout) ?;
70
+ self . write_immediate ( * res, dest) ?;
71
+ }
72
+
67
73
CastKind :: PointerCoercion (
68
74
PointerCoercion :: MutToConstPointer | PointerCoercion :: ArrayToPointer ,
69
75
) => {
@@ -204,7 +210,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
204
210
assert ! ( cast_to. ty. is_unsafe_ptr( ) ) ;
205
211
// Handle casting any ptr to raw ptr (might be a fat ptr).
206
212
if cast_to. size == src. layout . size {
207
- // Thin or fat pointer that just hast the ptr kind of target type changed.
213
+ // Thin or fat pointer that just has the ptr kind of target type changed.
208
214
return Ok ( ImmTy :: from_immediate ( * * src, cast_to) ) ;
209
215
} else {
210
216
// Casting the metadata away from a fat ptr.
@@ -225,6 +231,22 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
225
231
}
226
232
}
227
233
234
+ fn ptr_to_metadata (
235
+ & self ,
236
+ src : & ImmTy < ' tcx , M :: Provenance > ,
237
+ cast_to : TyAndLayout < ' tcx > ,
238
+ ) -> InterpResult < ' tcx , ImmTy < ' tcx , M :: Provenance > > {
239
+ assert ! ( src. layout. ty. is_unsafe_ptr( ) ) ;
240
+ return Ok ( match * * src {
241
+ Immediate :: Scalar ( _) => {
242
+ assert ! ( cast_to. is_zst( ) ) ;
243
+ ImmTy :: uninit ( cast_to)
244
+ }
245
+ Immediate :: ScalarPair ( _, meta) => ImmTy :: from_scalar ( meta, cast_to) ,
246
+ Immediate :: Uninit => throw_ub ! ( InvalidUninitBytes ( None ) ) ,
247
+ } ) ;
248
+ }
249
+
228
250
pub fn pointer_expose_provenance_cast (
229
251
& mut self ,
230
252
src : & ImmTy < ' tcx , M :: Provenance > ,
0 commit comments