@@ -297,32 +297,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
297297 Immediate :: new_slice ( ptr, length. eval_usize ( * self . tcx , self . param_env ) , self ) ;
298298 self . write_immediate ( val, dest)
299299 }
300- ( & ty:: Dynamic ( ref data_a, ..) , & ty:: Dynamic ( ref data_b, ..) ) => {
301- let val = self . read_immediate ( src) ?;
302- let ( old_data, old_vptr) = val. to_scalar_pair ( ) ?;
300+ ( & ty:: Dynamic ( ref _data_a, ..) , & ty:: Dynamic ( ref data_b, ..) ) => {
301+ let ( old_data, old_vptr) = self . read_immediate ( src) ?. to_scalar_pair ( ) ?;
303302 let old_vptr = self . scalar_to_ptr ( old_vptr) ?;
304- if data_a. principal_def_id ( ) == data_b. principal_def_id ( ) {
305- return self . write_immediate ( * val, dest) ;
306- }
307- // trait upcasting coercion
308- let Some ( vptr_entry_idx) = self . tcx . vtable_trait_upcasting_coercion_new_vptr_slot ( (
309- src_pointee_ty,
310- dest_pointee_ty,
311- ) ) else {
312- return self . write_immediate ( * val, dest) ;
313- } ;
314-
315303 let ( ty, _) = self . get_ptr_vtable ( old_vptr) ?;
316- let Some ( ty:: VtblEntry :: TraitVPtr ( new_trait) ) = self . get_vtable_entries ( old_vptr) ?. get ( vptr_entry_idx) else {
317- throw_ub_format ! (
318- "upcasting to index {vptr_entry_idx} of vtable {old_vptr} but \
319- that vtable is too small or does not have an upcast-vtable at that index"
320- )
321- } ;
322- let new_trait = new_trait. map_bound ( |trait_ref| {
323- ty:: ExistentialTraitRef :: erase_self_ty ( * self . tcx , trait_ref)
324- } ) ;
325- let new_vptr = self . get_vtable_ptr ( ty, Some ( new_trait) ) ?;
304+ let new_vptr = self . get_vtable_ptr ( ty, data_b. principal ( ) ) ?;
326305 self . write_immediate ( Immediate :: new_dyn_trait ( old_data, new_vptr, self ) , dest)
327306 }
328307 ( _, & ty:: Dynamic ( ref data, _) ) => {
0 commit comments