about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2024-06-14 09:40:44 +0000
committerOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2024-06-14 09:40:44 +0000
commit5c8bb678d07da4fe64e0595e7ace7b993fc0f000 (patch)
tree20435f9f0d56b6e503f1b720f5c7b76e5a47ff69
parentd2ad293851dc8e14a61355d0358490b77efae8cb (diff)
downloadrust-5c8bb678d07da4fe64e0595e7ace7b993fc0f000.tar.gz
rust-5c8bb678d07da4fe64e0595e7ace7b993fc0f000.zip
Use a consistent way to filter out bounds instead of splitting it into three places
-rw-r--r--compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs17
1 files changed, 6 insertions, 11 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs b/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs
index 6db5fa0e4e5..cb5a9da2caa 100644
--- a/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs
+++ b/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs
@@ -239,24 +239,19 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
             return Ok(());
         }
 
-        let all_bounds = stack
+        let bounds = stack
             .obligation
             .param_env
             .caller_bounds()
             .iter()
             .filter(|p| !p.references_error())
-            .filter_map(|p| p.as_trait_clause());
-
-        // Micro-optimization: filter out predicates relating to different traits.
-        let matching_bounds =
-            all_bounds.filter(|p| p.def_id() == stack.obligation.predicate.def_id());
+            .filter_map(|p| p.as_trait_clause())
+            // Micro-optimization: filter out predicates relating to different traits.
+            .filter(|p| p.def_id() == stack.obligation.predicate.def_id())
+            .filter(|p| p.polarity() == stack.obligation.predicate.polarity());
 
         // Keep only those bounds which may apply, and propagate overflow if it occurs.
-        for bound in matching_bounds {
-            if bound.skip_binder().polarity != stack.obligation.predicate.skip_binder().polarity {
-                continue;
-            }
-
+        for bound in bounds {
             // FIXME(oli-obk): it is suspicious that we are dropping the constness and
             // polarity here.
             let wc = self.where_clause_may_apply(stack, bound.map_bound(|t| t.trait_ref))?;