@@ -1114,8 +1114,10 @@ pub fn typeid_for_instance<'tcx>(
11141114 mut instance : Instance < ' tcx > ,
11151115 options : TypeIdOptions ,
11161116) -> String {
1117- if matches ! ( instance. def, ty:: InstanceDef :: Virtual ( ..) ) {
1118- instance. args = strip_receiver_auto ( tcx, instance. args )
1117+ if let ty:: InstanceDef :: Virtual ( def_id, _) = instance. def {
1118+ let upcast_ty = upcast ( tcx, def_id, instance. args ) ;
1119+ let stripped_ty = strip_receiver_auto ( tcx, upcast_ty) ;
1120+ instance. args = tcx. mk_args_trait ( stripped_ty, instance. args . into_iter ( ) . skip ( 1 ) ) ;
11191121 }
11201122
11211123 if let Some ( impl_id) = tcx. impl_of_method ( instance. def_id ( ) )
@@ -1146,11 +1148,7 @@ pub fn typeid_for_instance<'tcx>(
11461148 typeid_for_fnabi ( tcx, fn_abi, options)
11471149}
11481150
1149- fn strip_receiver_auto < ' tcx > (
1150- tcx : TyCtxt < ' tcx > ,
1151- args : ty:: GenericArgsRef < ' tcx > ,
1152- ) -> ty:: GenericArgsRef < ' tcx > {
1153- let ty = args. type_at ( 0 ) ;
1151+ fn strip_receiver_auto < ' tcx > ( tcx : TyCtxt < ' tcx > , ty : Ty < ' tcx > ) -> Ty < ' tcx > {
11541152 let ty:: Dynamic ( preds, lifetime, kind) = ty. kind ( ) else {
11551153 bug ! ( "Tried to strip auto traits from non-dynamic type {ty}" ) ;
11561154 } ;
@@ -1162,8 +1160,7 @@ fn strip_receiver_auto<'tcx>(
11621160 } else {
11631161 ty:: List :: empty ( )
11641162 } ;
1165- let new_rcvr = Ty :: new_dynamic ( tcx, filtered_preds, * lifetime, * kind) ;
1166- tcx. mk_args_trait ( new_rcvr, args. into_iter ( ) . skip ( 1 ) )
1163+ Ty :: new_dynamic ( tcx, filtered_preds, * lifetime, * kind)
11671164}
11681165
11691166fn trait_object_ty < ' tcx > ( tcx : TyCtxt < ' tcx > , poly_trait_ref : ty:: PolyTraitRef < ' tcx > ) -> Ty < ' tcx > {
@@ -1198,3 +1195,13 @@ fn trait_object_ty<'tcx>(tcx: TyCtxt<'tcx>, poly_trait_ref: ty::PolyTraitRef<'tc
11981195 ) ;
11991196 Ty :: new_dynamic ( tcx, preds, tcx. lifetimes . re_erased , ty:: Dyn )
12001197}
1198+
1199+ fn upcast < ' tcx > ( tcx : TyCtxt < ' tcx > , def_id : DefId , args : GenericArgsRef < ' tcx > ) -> Ty < ' tcx > {
1200+ let self_ty = args. type_at ( 0 ) ;
1201+ let Some ( trait_id) = tcx. trait_of_item ( def_id) else {
1202+ // If it's a virtual call to `drop_in_place`, it won't be on a trait.
1203+ return self_ty;
1204+ } ;
1205+ let trait_ref = ty:: TraitRef :: from_method ( tcx, trait_id, args) ;
1206+ trait_object_ty ( tcx, ty:: Binder :: dummy ( trait_ref) )
1207+ }
0 commit comments