@@ -670,6 +670,23 @@ where
670670 } ) ;
671671 }
672672
673+ let mk_dyn_vtable = || {
674+ tcx. mk_imm_ref ( tcx. lifetimes . re_static , tcx. mk_array ( tcx. types . usize , 3 ) )
675+ /* FIXME: use actual fn pointers
676+ Warning: naively computing the number of entries in the
677+ vtable by counting the methods on the trait + methods on
678+ all parent traits does not work, because some methods can
679+ be not object safe and thus excluded from the vtable.
680+ Increase this counter if you tried to implement this but
681+ failed to do it without duplicating a lot of code from
682+ other places in the compiler: 2
683+ tcx.mk_tup(&[
684+ tcx.mk_array(tcx.types.usize, 3),
685+ tcx.mk_array(Option<fn()>),
686+ ])
687+ */
688+ } ;
689+
673690 let metadata = if let Some ( metadata_def_id) = tcx. lang_items ( ) . metadata_type ( ) {
674691 let metadata = tcx. normalize_erasing_regions (
675692 cx. param_env ( ) ,
@@ -684,48 +701,14 @@ where
684701 && Some ( def. did ( ) ) == tcx. lang_items ( ) . dyn_metadata ( )
685702 && substs. type_at ( 0 ) . is_trait ( )
686703 {
687- tcx. mk_imm_ref (
688- tcx. lifetimes . re_static ,
689- tcx. mk_array ( tcx. types . usize , 3 ) ,
690- )
691- /* FIXME: use actual fn pointers
692- Warning: naively computing the number of entries in the
693- vtable by counting the methods on the trait + methods on
694- all parent traits does not work, because some methods can
695- be not object safe and thus excluded from the vtable.
696- Increase this counter if you tried to implement this but
697- failed to do it without duplicating a lot of code from
698- other places in the compiler: 2
699- tcx.mk_tup(&[
700- tcx.mk_array(tcx.types.usize, 3),
701- tcx.mk_array(Option<fn()>),
702- ])
703- */
704+ mk_dyn_vtable ( )
704705 } else {
705706 metadata
706707 }
707708 } else {
708709 match tcx. struct_tail_erasing_lifetimes ( pointee, cx. param_env ( ) ) . kind ( ) {
709710 ty:: Slice ( _) | ty:: Str => tcx. types . usize ,
710- ty:: Dynamic ( _, _, ty:: Dyn ) => {
711- tcx. mk_imm_ref (
712- tcx. lifetimes . re_static ,
713- tcx. mk_array ( tcx. types . usize , 3 ) ,
714- )
715- /* FIXME: use actual fn pointers
716- Warning: naively computing the number of entries in the
717- vtable by counting the methods on the trait + methods on
718- all parent traits does not work, because some methods can
719- be not object safe and thus excluded from the vtable.
720- Increase this counter if you tried to implement this but
721- failed to do it without duplicating a lot of code from
722- other places in the compiler: 2
723- tcx.mk_tup(&[
724- tcx.mk_array(tcx.types.usize, 3),
725- tcx.mk_array(Option<fn()>),
726- ])
727- */
728- }
711+ ty:: Dynamic ( _, _, ty:: Dyn ) => mk_dyn_vtable ( ) ,
729712 _ => bug ! ( "TyAndLayout::field({:?}): not applicable" , this) ,
730713 }
731714 } ;
0 commit comments