change snapshot tracking in fulfillment contexts
This commit is contained in:
parent
46973c9c8a
commit
d04775d739
23 changed files with 79 additions and 121 deletions
|
@ -25,20 +25,27 @@ use super::{Certainty, InferCtxtEvalExt};
|
|||
/// here as this will have to deal with far more root goals than `evaluate_all`.
|
||||
pub struct FulfillmentCtxt<'tcx> {
|
||||
obligations: Vec<PredicateObligation<'tcx>>,
|
||||
|
||||
/// The snapshot in which this context was created. Using the context
|
||||
/// outside of this snapshot leads to subtle bugs if the snapshot
|
||||
/// gets rolled back. Because of this we explicitly check that we only
|
||||
/// use the context in exactly this snapshot.
|
||||
usable_in_snapshot: usize,
|
||||
}
|
||||
|
||||
impl<'tcx> FulfillmentCtxt<'tcx> {
|
||||
pub fn new() -> FulfillmentCtxt<'tcx> {
|
||||
FulfillmentCtxt { obligations: Vec::new() }
|
||||
pub fn new(infcx: &InferCtxt<'tcx>) -> FulfillmentCtxt<'tcx> {
|
||||
FulfillmentCtxt { obligations: Vec::new(), usable_in_snapshot: infcx.num_open_snapshots() }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> TraitEngine<'tcx> for FulfillmentCtxt<'tcx> {
|
||||
fn register_predicate_obligation(
|
||||
&mut self,
|
||||
_infcx: &InferCtxt<'tcx>,
|
||||
infcx: &InferCtxt<'tcx>,
|
||||
obligation: PredicateObligation<'tcx>,
|
||||
) {
|
||||
assert_eq!(self.usable_in_snapshot, infcx.num_open_snapshots());
|
||||
self.obligations.push(obligation);
|
||||
}
|
||||
|
||||
|
@ -72,6 +79,7 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentCtxt<'tcx> {
|
|||
}
|
||||
|
||||
fn select_where_possible(&mut self, infcx: &InferCtxt<'tcx>) -> Vec<FulfillmentError<'tcx>> {
|
||||
assert_eq!(self.usable_in_snapshot, infcx.num_open_snapshots());
|
||||
let mut errors = Vec::new();
|
||||
for i in 0.. {
|
||||
if !infcx.tcx.recursion_limit().value_within_limit(i) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue