Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/next_solver/fulfill.rs')
-rw-r--r--crates/hir-ty/src/next_solver/fulfill.rs8
1 files changed, 5 insertions, 3 deletions
diff --git a/crates/hir-ty/src/next_solver/fulfill.rs b/crates/hir-ty/src/next_solver/fulfill.rs
index 0fe0732972..a8bff44a02 100644
--- a/crates/hir-ty/src/next_solver/fulfill.rs
+++ b/crates/hir-ty/src/next_solver/fulfill.rs
@@ -48,6 +48,7 @@ pub struct FulfillmentCtxt<'db> {
/// use the context in exactly this snapshot.
#[expect(unused)]
usable_in_snapshot: usize,
+ try_evaluate_obligations_scratch: PendingObligations<'db>,
}
#[derive(Default, Debug, Clone)]
@@ -115,6 +116,7 @@ impl<'db> FulfillmentCtxt<'db> {
FulfillmentCtxt {
obligations: Default::default(),
usable_in_snapshot: infcx.num_open_snapshots(),
+ try_evaluate_obligations_scratch: Default::default(),
}
}
}
@@ -162,12 +164,12 @@ impl<'db> FulfillmentCtxt<'db> {
// and select. They should use a different `ObligationCtxt` instead. Then we'll be also able
// to not put the obligations queue in `InferenceTable`'s snapshots.
// assert_eq!(self.usable_in_snapshot, infcx.num_open_snapshots());
+ self.try_evaluate_obligations_scratch.clear();
let mut errors = Vec::new();
- let mut obligations = Vec::new();
loop {
let mut any_changed = false;
- obligations.extend(self.obligations.drain_pending(|_| true));
- for (mut obligation, stalled_on) in obligations.drain(..) {
+ self.try_evaluate_obligations_scratch.extend(self.obligations.drain_pending(|_| true));
+ for (mut obligation, stalled_on) in self.try_evaluate_obligations_scratch.drain(..) {
if obligation.recursion_depth >= infcx.interner.recursion_limit() {
self.obligations.on_fulfillment_overflow(infcx);
// Only return true errors that we have accumulated while processing.