add hacky closure to struct_tail_with_normalize in order to allow us to walk valtrees in lockstep with the type

This commit is contained in:
b-naber 2022-04-26 10:56:04 +02:00
parent f7eae4e580
commit 6fc3e630fb
3 changed files with 28 additions and 16 deletions

View File

@ -2273,7 +2273,7 @@ impl<'tcx> Ty<'tcx> {
tcx: TyCtxt<'tcx>,
normalize: impl FnMut(Ty<'tcx>) -> Ty<'tcx>,
) -> (Ty<'tcx>, bool) {
let tail = tcx.struct_tail_with_normalize(self, normalize);
let tail = tcx.struct_tail_with_normalize(self, normalize, || {});
match tail.kind() {
// Sized types
ty::Infer(ty::IntVar(_) | ty::FloatVar(_))

View File

@ -187,7 +187,7 @@ impl<'tcx> TyCtxt<'tcx> {
/// if input `ty` is not a structure at all.
pub fn struct_tail_without_normalization(self, ty: Ty<'tcx>) -> Ty<'tcx> {
let tcx = self;
tcx.struct_tail_with_normalize(ty, |ty| ty)
tcx.struct_tail_with_normalize(ty, |ty| ty, || {})
}
/// Returns the deeply last field of nested structures, or the same type if
@ -203,7 +203,7 @@ impl<'tcx> TyCtxt<'tcx> {
param_env: ty::ParamEnv<'tcx>,
) -> Ty<'tcx> {
let tcx = self;
tcx.struct_tail_with_normalize(ty, |ty| tcx.normalize_erasing_regions(param_env, ty))
tcx.struct_tail_with_normalize(ty, |ty| tcx.normalize_erasing_regions(param_env, ty), || {})
}
/// Returns the deeply last field of nested structures, or the same type if
@ -220,6 +220,10 @@ impl<'tcx> TyCtxt<'tcx> {
self,
mut ty: Ty<'tcx>,
mut normalize: impl FnMut(Ty<'tcx>) -> Ty<'tcx>,
// This is a hack that is currently used to allow us to walk a ValTree
// in lockstep with the type in order to get the ValTree branch that
// corresponds to an unsized field.
mut f: impl FnMut() -> (),
) -> Ty<'tcx> {
let recursion_limit = self.recursion_limit();
for iteration in 0.. {
@ -235,12 +239,16 @@ impl<'tcx> TyCtxt<'tcx> {
break;
}
match def.non_enum_variant().fields.last() {
Some(f) => ty = f.ty(self, substs),
Some(field) => {
f();
ty = field.ty(self, substs);
}
None => break,
}
}
ty::Tuple(tys) if let Some((&last_ty, _)) = tys.split_last() => {
f();
ty = last_ty;
}

View File

@ -1519,18 +1519,22 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
// Any type with multiple potential metadata types is therefore not eligible.
let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty());
let tail = selcx.tcx().struct_tail_with_normalize(self_ty, |ty| {
// We throw away any obligations we get from this, since we normalize
// and confirm these obligations once again during confirmation
normalize_with_depth(
selcx,
obligation.param_env,
obligation.cause.clone(),
obligation.recursion_depth + 1,
ty,
)
.value
});
let tail = selcx.tcx().struct_tail_with_normalize(
self_ty,
|ty| {
// We throw away any obligations we get from this, since we normalize
// and confirm these obligations once again during confirmation
normalize_with_depth(
selcx,
obligation.param_env,
obligation.cause.clone(),
obligation.recursion_depth + 1,
ty,
)
.value
},
|| {},
);
match tail.kind() {
ty::Bool