@@ -234,6 +234,11 @@ fn vtable_entries<'tcx>(
234234 "vtable trait ref should be normalized"
235235 ) ;
236236
237+ // We're monomorphizing a dyn trait object that can never be constructed.
238+ if tcx. instantiate_and_check_impossible_predicates ( ( trait_ref. def_id , trait_ref. args ) ) {
239+ return TyCtxt :: COMMON_VTABLE_ENTRIES ;
240+ }
241+
237242 debug ! ( "vtable_entries({:?})" , trait_ref) ;
238243
239244 let mut entries = vec ! [ ] ;
@@ -316,6 +321,11 @@ pub(crate) fn first_method_vtable_slot<'tcx>(tcx: TyCtxt<'tcx>, key: ty::TraitRe
316321 "vtable trait ref should be normalized"
317322 ) ;
318323
324+ // We're monomorphizing a dyn trait object that can never be constructed.
325+ if tcx. instantiate_and_check_impossible_predicates ( ( key. def_id , key. args ) ) {
326+ return 0 ;
327+ }
328+
319329 let ty:: Dynamic ( source, _, _) = * key. self_ty ( ) . kind ( ) else {
320330 bug ! ( ) ;
321331 } ;
@@ -375,19 +385,27 @@ pub(crate) fn supertrait_vtable_slot<'tcx>(
375385 let ( source, target) = key;
376386
377387 // If the target principal is `None`, we can just return `None`.
378- let ty:: Dynamic ( target , _, _) = * target. kind ( ) else {
388+ let ty:: Dynamic ( target_data , _, _) = * target. kind ( ) else {
379389 bug ! ( ) ;
380390 } ;
381- let target_principal = tcx. instantiate_bound_regions_with_erased ( target . principal ( ) ?) ;
391+ let target_principal = tcx. instantiate_bound_regions_with_erased ( target_data . principal ( ) ?) ;
382392
383393 // Given that we have a target principal, it is a bug for there not to be a source principal.
384- let ty:: Dynamic ( source , _, _) = * source. kind ( ) else {
394+ let ty:: Dynamic ( source_data , _, _) = * source. kind ( ) else {
385395 bug ! ( ) ;
386396 } ;
387397 let source_principal = tcx. instantiate_bound_regions_with_erased (
388- source . principal ( ) . unwrap ( ) . with_self_ty ( tcx, tcx . types . trait_object_dummy_self ) ,
398+ source_data . principal ( ) . unwrap ( ) . with_self_ty ( tcx, source_data ) ,
389399 ) ;
390400
401+ // We're monomorphizing a dyn trait object that can never be constructed.
402+ if tcx. instantiate_and_check_impossible_predicates ( (
403+ source_principal. def_id ,
404+ source_principal. args ,
405+ ) ) {
406+ return None ;
407+ }
408+
391409 let vtable_segment_callback = {
392410 let mut vptr_offset = 0 ;
393411 move |segment| {
0 commit comments