From 9f20fa87d82b8163841250a3f06683449a41c335 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Wed, 1 May 2024 22:39:49 -0400 Subject: [PATCH] Take ocx by move for pending obligations --- compiler/rustc_hir_analysis/src/autoderef.rs | 2 +- compiler/rustc_hir_typeck/src/coercion.rs | 4 ++-- compiler/rustc_trait_selection/src/traits/engine.rs | 9 ++++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_hir_analysis/src/autoderef.rs b/compiler/rustc_hir_analysis/src/autoderef.rs index 4e85045ef495b..f101c595bdf35 100644 --- a/compiler/rustc_hir_analysis/src/autoderef.rs +++ b/compiler/rustc_hir_analysis/src/autoderef.rs @@ -188,7 +188,7 @@ impl<'a, 'tcx> Autoderef<'a, 'tcx> { return None; } - Some((normalized_ty, ocx.pending_obligations())) + Some((normalized_ty, ocx.into_pending_obligations())) } /// Returns the final type we ended up with, which may be an inference diff --git a/compiler/rustc_hir_typeck/src/coercion.rs b/compiler/rustc_hir_typeck/src/coercion.rs index 92f709c84d0be..2a5886d3185d3 100644 --- a/compiler/rustc_hir_typeck/src/coercion.rs +++ b/compiler/rustc_hir_typeck/src/coercion.rs @@ -165,7 +165,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> { let ocx = ObligationCtxt::new(self); ocx.register_obligations(obligations); if ocx.select_where_possible().is_empty() { - Ok(InferOk { value, obligations: ocx.pending_obligations() }) + Ok(InferOk { value, obligations: ocx.into_pending_obligations() }) } else { Err(TypeError::Mismatch) } @@ -633,7 +633,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> { if !ocx.select_where_possible().is_empty() { return Err(TypeError::Mismatch); } - coercion.obligations.extend(ocx.pending_obligations()); + coercion.obligations.extend(ocx.into_pending_obligations()); continue; } _ => { diff --git a/compiler/rustc_trait_selection/src/traits/engine.rs b/compiler/rustc_trait_selection/src/traits/engine.rs index 9eaaef1eb228f..551c8e7702ef7 100644 --- a/compiler/rustc_trait_selection/src/traits/engine.rs +++ b/compiler/rustc_trait_selection/src/traits/engine.rs @@ -195,8 +195,15 @@ impl<'a, 'tcx> ObligationCtxt<'a, 'tcx> { self.engine.borrow_mut().select_all_or_error(self.infcx) } + /// Returns the not-yet-processed and stalled obligations from the + /// `ObligationCtxt`. + /// + /// Takes ownership of the context as doing operations such as + /// [`ObligationCtxt::eq`] afterwards will result in other obligations + /// getting ignored. You can make a new `ObligationCtxt` if this + /// needs to be done in a loop, for example. #[must_use] - pub fn pending_obligations(&self) -> Vec> { + pub fn into_pending_obligations(self) -> Vec> { self.engine.borrow().pending_obligations() }