1
Fork 0

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:
Matthias Krüger 2022-02-21 19:36:54 +01:00 committed by GitHub
commit 9157775152
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 19 additions and 23 deletions

View file

@ -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,

View file

@ -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,

View file

@ -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>,

View file

@ -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();

View file

@ -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>> {

View file

@ -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));
} }

View file

@ -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>,