Rollup merge of #94215 - lcnr:leak-check, r=jackh726
trait system: comments and small nonfunctional changes r? `@nikomatsakis` because of the leak-check check removal
This commit is contained in:
commit
9157775152
7 changed files with 19 additions and 23 deletions
|
@ -132,11 +132,11 @@ type ObligationTreeIdGenerator =
|
||||||
std::iter::Map<std::ops::RangeFrom<usize>, fn(usize) -> ObligationTreeId>;
|
std::iter::Map<std::ops::RangeFrom<usize>, fn(usize) -> ObligationTreeId>;
|
||||||
|
|
||||||
pub struct ObligationForest<O: ForestObligation> {
|
pub struct ObligationForest<O: ForestObligation> {
|
||||||
/// The list of obligations. In between calls to `process_obligations`,
|
/// The list of obligations. In between calls to [Self::process_obligations],
|
||||||
/// this list only contains nodes in the `Pending` or `Waiting` state.
|
/// this list only contains nodes in the `Pending` or `Waiting` state.
|
||||||
///
|
///
|
||||||
/// `usize` indices are used here and throughout this module, rather than
|
/// `usize` indices are used here and throughout this module, rather than
|
||||||
/// `rustc_index::newtype_index!` indices, because this code is hot enough
|
/// [`rustc_index::newtype_index!`] indices, because this code is hot enough
|
||||||
/// that the `u32`-to-`usize` conversions that would be required are
|
/// that the `u32`-to-`usize` conversions that would be required are
|
||||||
/// significant, and space considerations are not important.
|
/// significant, and space considerations are not important.
|
||||||
nodes: Vec<Node<O>>,
|
nodes: Vec<Node<O>>,
|
||||||
|
@ -146,10 +146,11 @@ pub struct ObligationForest<O: ForestObligation> {
|
||||||
|
|
||||||
/// A cache of the nodes in `nodes`, indexed by predicate. Unfortunately,
|
/// A cache of the nodes in `nodes`, indexed by predicate. Unfortunately,
|
||||||
/// its contents are not guaranteed to match those of `nodes`. See the
|
/// its contents are not guaranteed to match those of `nodes`. See the
|
||||||
/// comments in `process_obligation` for details.
|
/// comments in [`Self::process_obligation` for details.
|
||||||
active_cache: FxHashMap<O::CacheKey, usize>,
|
active_cache: FxHashMap<O::CacheKey, usize>,
|
||||||
|
|
||||||
/// A vector reused in compress() and find_cycles_from_node(), to avoid allocating new vectors.
|
/// A vector reused in [Self::compress()] and [Self::find_cycles_from_node()],
|
||||||
|
/// to avoid allocating new vectors.
|
||||||
reused_node_vec: Vec<usize>,
|
reused_node_vec: Vec<usize>,
|
||||||
|
|
||||||
obligation_tree_id_generator: ObligationTreeIdGenerator,
|
obligation_tree_id_generator: ObligationTreeIdGenerator,
|
||||||
|
|
|
@ -123,7 +123,9 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/// See `infer::region_constraints::RegionConstraintCollector::leak_check`.
|
/// See [RegionConstraintCollector::leak_check][1].
|
||||||
|
///
|
||||||
|
/// [1]: crate::infer::region_constraints::RegionConstraintCollector::leak_check
|
||||||
pub fn leak_check(
|
pub fn leak_check(
|
||||||
&self,
|
&self,
|
||||||
overly_polymorphic: bool,
|
overly_polymorphic: bool,
|
||||||
|
|
|
@ -100,6 +100,7 @@ impl<'tcx> RegionConstraintCollector<'_, 'tcx> {
|
||||||
struct LeakCheck<'me, 'tcx> {
|
struct LeakCheck<'me, 'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
universe_at_start_of_snapshot: ty::UniverseIndex,
|
universe_at_start_of_snapshot: ty::UniverseIndex,
|
||||||
|
/// Only used when reporting region errors.
|
||||||
overly_polymorphic: bool,
|
overly_polymorphic: bool,
|
||||||
mini_graph: &'me MiniGraph<'tcx>,
|
mini_graph: &'me MiniGraph<'tcx>,
|
||||||
rcc: &'me RegionConstraintCollector<'me, 'tcx>,
|
rcc: &'me RegionConstraintCollector<'me, 'tcx>,
|
||||||
|
|
|
@ -160,20 +160,12 @@ fn overlap<'cx, 'tcx>(
|
||||||
);
|
);
|
||||||
|
|
||||||
selcx.infcx().probe_maybe_skip_leak_check(skip_leak_check.is_yes(), |snapshot| {
|
selcx.infcx().probe_maybe_skip_leak_check(skip_leak_check.is_yes(), |snapshot| {
|
||||||
overlap_within_probe(
|
overlap_within_probe(selcx, impl1_def_id, impl2_def_id, overlap_mode, snapshot)
|
||||||
selcx,
|
|
||||||
skip_leak_check,
|
|
||||||
impl1_def_id,
|
|
||||||
impl2_def_id,
|
|
||||||
overlap_mode,
|
|
||||||
snapshot,
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn overlap_within_probe<'cx, 'tcx>(
|
fn overlap_within_probe<'cx, 'tcx>(
|
||||||
selcx: &mut SelectionContext<'cx, 'tcx>,
|
selcx: &mut SelectionContext<'cx, 'tcx>,
|
||||||
skip_leak_check: SkipLeakCheck,
|
|
||||||
impl1_def_id: DefId,
|
impl1_def_id: DefId,
|
||||||
impl2_def_id: DefId,
|
impl2_def_id: DefId,
|
||||||
overlap_mode: OverlapMode,
|
overlap_mode: OverlapMode,
|
||||||
|
@ -207,11 +199,11 @@ fn overlap_within_probe<'cx, 'tcx>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !skip_leak_check.is_yes() {
|
// We disable the leak when when creating the `snapshot` by using
|
||||||
if infcx.leak_check(true, snapshot).is_err() {
|
// `infcx.probe_maybe_disable_leak_check`.
|
||||||
debug!("overlap: leak check failed");
|
if infcx.leak_check(true, snapshot).is_err() {
|
||||||
return None;
|
debug!("overlap: leak check failed");
|
||||||
}
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let intercrate_ambiguity_causes = selcx.take_intercrate_ambiguity_causes();
|
let intercrate_ambiguity_causes = selcx.take_intercrate_ambiguity_causes();
|
||||||
|
|
|
@ -314,7 +314,7 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> {
|
||||||
return ProcessResult::Unchanged;
|
return ProcessResult::Unchanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.progress_changed_obligations(pending_obligation)
|
self.process_changed_obligations(pending_obligation)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process_backedge<'c, I>(
|
fn process_backedge<'c, I>(
|
||||||
|
@ -338,7 +338,7 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> {
|
||||||
// actually uses this, so move this part of the code
|
// actually uses this, so move this part of the code
|
||||||
// out of that loop.
|
// out of that loop.
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
fn progress_changed_obligations(
|
fn process_changed_obligations(
|
||||||
&mut self,
|
&mut self,
|
||||||
pending_obligation: &mut PendingPredicateObligation<'tcx>,
|
pending_obligation: &mut PendingPredicateObligation<'tcx>,
|
||||||
) -> ProcessResult<PendingPredicateObligation<'tcx>, FulfillmentErrorCode<'tcx>> {
|
) -> ProcessResult<PendingPredicateObligation<'tcx>, FulfillmentErrorCode<'tcx>> {
|
||||||
|
|
|
@ -389,7 +389,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
for bound in matching_bounds {
|
for bound in matching_bounds {
|
||||||
// FIXME(oli-obk): it is suspicious that we are dropping the constness and
|
// FIXME(oli-obk): it is suspicious that we are dropping the constness and
|
||||||
// polarity here.
|
// polarity here.
|
||||||
let wc = self.evaluate_where_clause(stack, bound.map_bound(|t| t.trait_ref))?;
|
let wc = self.where_clause_may_apply(stack, bound.map_bound(|t| t.trait_ref))?;
|
||||||
if wc.may_apply() {
|
if wc.may_apply() {
|
||||||
candidates.vec.push(ParamCandidate(bound));
|
candidates.vec.push(ParamCandidate(bound));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1481,7 +1481,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
.map_err(|_| ())
|
.map_err(|_| ())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn evaluate_where_clause<'o>(
|
fn where_clause_may_apply<'o>(
|
||||||
&mut self,
|
&mut self,
|
||||||
stack: &TraitObligationStack<'o, 'tcx>,
|
stack: &TraitObligationStack<'o, 'tcx>,
|
||||||
where_clause_trait_ref: ty::PolyTraitRef<'tcx>,
|
where_clause_trait_ref: ty::PolyTraitRef<'tcx>,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue