update recursion depth in confirm_candidate

(cherry picked from commit 1708ad65a4)
This commit is contained in:
lcnr
2023-05-19 10:32:35 +02:00
committed by Josh Stone
parent 1a42cb7fff
commit a365f58bf6
2 changed files with 26 additions and 3 deletions
+20 -3
View File
@@ -697,9 +697,9 @@ impl<'tcx, N> ImplSource<'tcx, N> {
} }
pub fn borrow_nested_obligations(&self) -> &[N] { pub fn borrow_nested_obligations(&self) -> &[N] {
match &self { match self {
ImplSource::UserDefined(i) => &i.nested[..], ImplSource::UserDefined(i) => &i.nested,
ImplSource::Param(n, _) => &n, ImplSource::Param(n, _) => n,
ImplSource::Builtin(i) => &i.nested, ImplSource::Builtin(i) => &i.nested,
ImplSource::AutoImpl(d) => &d.nested, ImplSource::AutoImpl(d) => &d.nested,
ImplSource::Closure(c) => &c.nested, ImplSource::Closure(c) => &c.nested,
@@ -713,6 +713,23 @@ impl<'tcx, N> ImplSource<'tcx, N> {
} }
} }
pub fn borrow_nested_obligations_mut(&mut self) -> &mut [N] {
match self {
ImplSource::UserDefined(i) => &mut i.nested,
ImplSource::Param(n, _) => n,
ImplSource::Builtin(i) => &mut i.nested,
ImplSource::AutoImpl(d) => &mut d.nested,
ImplSource::Closure(c) => &mut c.nested,
ImplSource::Generator(c) => &mut c.nested,
ImplSource::Future(c) => &mut c.nested,
ImplSource::Object(d) => &mut d.nested,
ImplSource::FnPointer(d) => &mut d.nested,
ImplSource::TraitAlias(d) => &mut d.nested,
ImplSource::TraitUpcasting(d) => &mut d.nested,
ImplSource::ConstDestruct(i) => &mut i.nested,
}
}
pub fn map<M, F>(self, f: F) -> ImplSource<'tcx, M> pub fn map<M, F>(self, f: F) -> ImplSource<'tcx, M>
where where
F: FnMut(N) -> M, F: FnMut(N) -> M,
@@ -131,6 +131,12 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
} }
}; };
// The obligations returned by confirmation are recursively evaluated
// so we need to make sure they have the correct depth.
for subobligation in impl_src.borrow_nested_obligations_mut() {
subobligation.set_depth_from_parent(obligation.recursion_depth);
}
if !obligation.predicate.is_const_if_const() { if !obligation.predicate.is_const_if_const() {
// normalize nested predicates according to parent predicate's constness. // normalize nested predicates according to parent predicate's constness.
impl_src = impl_src.map(|mut o| { impl_src = impl_src.map(|mut o| {