diff options
| author | Michael Goulet <michael@errs.io> | 2023-07-27 01:00:01 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2023-08-03 18:21:11 +0000 |
| commit | 238beae5e588fb3dc4550d970085b5bf29f40776 (patch) | |
| tree | 0f89ca79139d71d70ef6ef50ec5eefcb3e6265c4 /compiler/rustc_trait_selection/src | |
| parent | 4cc659eb3fc99cd44457616b17d390488e80fcb0 (diff) | |
| download | rust-238beae5e588fb3dc4550d970085b5bf29f40776.tar.gz rust-238beae5e588fb3dc4550d970085b5bf29f40776.zip | |
Fix upcasting with normalization in old solver, add a test
Diffstat (limited to 'compiler/rustc_trait_selection/src')
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/select/confirmation.rs | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs index 3cf2735b46b..3d6df08f6db 100644 --- a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs +++ b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs @@ -887,9 +887,19 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let ty::Dynamic(b_data, b_region, ty::Dyn) = *b_ty.kind() else { bug!() }; let source_principal = a_data.principal().unwrap().with_self_ty(tcx, a_ty); - let upcast_principal = util::supertraits(tcx, source_principal).nth(idx).unwrap(); + let unnormalized_upcast_principal = + util::supertraits(tcx, source_principal).nth(idx).unwrap(); let mut nested = vec![]; + let upcast_principal = normalize_with_depth_to( + self, + obligation.param_env, + obligation.cause.clone(), + obligation.recursion_depth + 1, + unnormalized_upcast_principal, + &mut nested, + ); + for bound in b_data { match bound.skip_binder() { // Check that a's supertrait (upcast_principal) is compatible @@ -973,7 +983,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } VtblSegment::TraitOwnEntries { trait_ref, emit_vptr } => { vptr_offset += count_own_vtable_entries(tcx, trait_ref); - if trait_ref == upcast_principal { + if trait_ref == unnormalized_upcast_principal { if emit_vptr { return ControlFlow::Break(Some(vptr_offset)); } else { |
