1
Fork 0

Fix upcasting with normalization in old solver, add a test

This commit is contained in:
Michael Goulet 2023-07-27 01:00:01 +00:00
parent 4cc659eb3f
commit 238beae5e5
2 changed files with 32 additions and 2 deletions

View file

@ -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 {