@@ -318,9 +318,17 @@ pub(crate) fn first_method_vtable_slot<'tcx>(tcx: TyCtxt<'tcx>, key: ty::TraitRe
318
318
bug ! ( ) ;
319
319
} ;
320
320
let source_principal = tcx. instantiate_bound_regions_with_erased (
321
- source. principal ( ) . unwrap ( ) . with_self_ty ( tcx, tcx . types . trait_object_dummy_self ) ,
321
+ source. principal ( ) . unwrap ( ) . with_self_ty ( tcx, key . self_ty ( ) ) ,
322
322
) ;
323
323
324
+ // We're monomorphizing a call to a dyn trait object that can never be constructed.
325
+ if tcx. instantiate_and_check_impossible_predicates ( (
326
+ source_principal. def_id ,
327
+ source_principal. args ,
328
+ ) ) {
329
+ return 0 ;
330
+ }
331
+
324
332
let target_principal = ty:: ExistentialTraitRef :: erase_self_ty ( tcx, key) ;
325
333
326
334
let vtable_segment_callback = {
@@ -373,19 +381,27 @@ pub(crate) fn supertrait_vtable_slot<'tcx>(
373
381
let ( source, target) = key;
374
382
375
383
// If the target principal is `None`, we can just return `None`.
376
- let ty:: Dynamic ( target , _, _) = * target. kind ( ) else {
384
+ let ty:: Dynamic ( target_data , _, _) = * target. kind ( ) else {
377
385
bug ! ( ) ;
378
386
} ;
379
- let target_principal = tcx. instantiate_bound_regions_with_erased ( target . principal ( ) ?) ;
387
+ let target_principal = tcx. instantiate_bound_regions_with_erased ( target_data . principal ( ) ?) ;
380
388
381
389
// Given that we have a target principal, it is a bug for there not to be a source principal.
382
- let ty:: Dynamic ( source , _, _) = * source. kind ( ) else {
390
+ let ty:: Dynamic ( source_data , _, _) = * source. kind ( ) else {
383
391
bug ! ( ) ;
384
392
} ;
385
393
let source_principal = tcx. instantiate_bound_regions_with_erased (
386
- source . principal ( ) . unwrap ( ) . with_self_ty ( tcx, tcx . types . trait_object_dummy_self ) ,
394
+ source_data . principal ( ) . unwrap ( ) . with_self_ty ( tcx, source ) ,
387
395
) ;
388
396
397
+ // We're monomorphizing a dyn trait object upcast that can never be constructed.
398
+ if tcx. instantiate_and_check_impossible_predicates ( (
399
+ source_principal. def_id ,
400
+ source_principal. args ,
401
+ ) ) {
402
+ return None ;
403
+ }
404
+
389
405
let vtable_segment_callback = {
390
406
let mut vptr_offset = 0 ;
391
407
move |segment| {
0 commit comments