about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSantiago Pastorino <spastorino@gmail.com>2021-10-23 00:03:33 -0300
committerSantiago Pastorino <spastorino@gmail.com>2021-10-23 08:55:48 -0300
commit3287f72d39df22a4672527f8f97a771d11071a6c (patch)
tree39f96f8a4ddb500544ee88236fa4620bbc725a1d
parent953418685769424388fb9ea1f4b2beaceedb6857 (diff)
downloadrust-3287f72d39df22a4672527f8f97a771d11071a6c.tar.gz
rust-3287f72d39df22a4672527f8f97a771d11071a6c.zip
Avoid code duplication by extracting checks into fns
-rw-r--r--compiler/rustc_trait_selection/src/traits/coherence.rs29
1 files changed, 18 insertions, 11 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/coherence.rs b/compiler/rustc_trait_selection/src/traits/coherence.rs
index 2d61675b856..42d3194aed4 100644
--- a/compiler/rustc_trait_selection/src/traits/coherence.rs
+++ b/compiler/rustc_trait_selection/src/traits/coherence.rs
@@ -8,7 +8,9 @@ use crate::infer::{CombinedSnapshot, InferOk, TyCtxtInferExt};
 use crate::traits::query::evaluate_obligation::InferCtxtExt;
 use crate::traits::select::IntercrateAmbiguityCause;
 use crate::traits::SkipLeakCheck;
-use crate::traits::{self, Normalized, Obligation, ObligationCause, SelectionContext};
+use crate::traits::{
+    self, Normalized, Obligation, ObligationCause, PredicateObligation, SelectionContext,
+};
 use rustc_hir::def_id::{DefId, LOCAL_CRATE};
 use rustc_middle::ty::fold::TypeFoldable;
 use rustc_middle::ty::subst::Subst;
@@ -159,6 +161,19 @@ fn overlap_within_probe(
     b_def_id: DefId,
     snapshot: &CombinedSnapshot<'_, 'tcx>,
 ) -> Option<OverlapResult<'tcx>> {
+    fn loose_check(selcx: &mut SelectionContext<'cx, 'tcx>, o: &PredicateObligation<'tcx>) -> bool {
+        !selcx.predicate_may_hold_fatal(o)
+    }
+
+    fn strict_check(selcx: &SelectionContext<'cx, 'tcx>, o: &PredicateObligation<'tcx>) -> bool {
+        let infcx = selcx.infcx();
+        let tcx = infcx.tcx;
+        o.flip_polarity(tcx)
+            .as_ref()
+            .map(|o| selcx.infcx().predicate_must_hold_modulo_regions(o))
+            .unwrap_or(false)
+    }
+
     // For the purposes of this check, we don't bring any placeholder
     // types into scope; instead, we replace the generic types with
     // fresh type variables, and hence we do our evaluations in an
@@ -227,17 +242,9 @@ fn overlap_within_probe(
             if tcx.has_attr(a_def_id, sym::rustc_strict_coherence)
                 && tcx.has_attr(b_def_id, sym::rustc_strict_coherence)
             {
-                o.flip_polarity(tcx)
-                    .as_ref()
-                    .map(|o| selcx.infcx().predicate_must_hold_modulo_regions(o))
-                    .unwrap_or(false)
+                strict_check(selcx, o)
             } else {
-                !selcx.predicate_may_hold_fatal(o)
-                    || tcx.features().negative_impls
-                        && o.flip_polarity(tcx)
-                            .as_ref()
-                            .map(|o| selcx.infcx().predicate_must_hold_modulo_regions(o))
-                            .unwrap_or(false)
+                loose_check(selcx, o) || tcx.features().negative_impls && strict_check(selcx, o)
             }
         });
     // FIXME: the call to `selcx.predicate_may_hold_fatal` above should be ported