about summary refs log tree commit diff
path: root/compiler/rustc_trait_selection/src
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2023-03-27 19:41:15 +0000
committerMichael Goulet <michael@errs.io>2023-03-29 16:13:05 +0000
commitd62238d6a8ed57fecddfa9b97fd79cb0ac814791 (patch)
tree2e3ce08aadf17a0c89d4f574b5c7d07c2999b6db /compiler/rustc_trait_selection/src
parentcf32b9de1e8f66526c36ad2927458558d2e81093 (diff)
downloadrust-d62238d6a8ed57fecddfa9b97fd79cb0ac814791.tar.gz
rust-d62238d6a8ed57fecddfa9b97fd79cb0ac814791.zip
Do not consider elaborated projection predicates for objects in new solver
Diffstat (limited to 'compiler/rustc_trait_selection/src')
-rw-r--r--compiler/rustc_trait_selection/src/solve/assembly.rs19
1 files changed, 16 insertions, 3 deletions
diff --git a/compiler/rustc_trait_selection/src/solve/assembly.rs b/compiler/rustc_trait_selection/src/solve/assembly.rs
index 0f7a0eb337b..856b1c08b72 100644
--- a/compiler/rustc_trait_selection/src/solve/assembly.rs
+++ b/compiler/rustc_trait_selection/src/solve/assembly.rs
@@ -6,6 +6,7 @@ use super::trait_goals::structural_traits::*;
 use super::{EvalCtxt, SolverMode};
 use crate::traits::coherence;
 use itertools::Itertools;
+use rustc_data_structures::fx::FxIndexSet;
 use rustc_hir::def_id::DefId;
 use rustc_infer::traits::query::NoSolution;
 use rustc_infer::traits::util::elaborate_predicates;
@@ -489,9 +490,21 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
         };
 
         let tcx = self.tcx();
-        for assumption in
-            elaborate_predicates(tcx, bounds.iter().map(|bound| bound.with_self_ty(tcx, self_ty)))
-        {
+        let own_bounds: FxIndexSet<_> =
+            bounds.iter().map(|bound| bound.with_self_ty(tcx, self_ty)).collect();
+        for assumption in elaborate_predicates(tcx, own_bounds.iter().copied()) {
+            // FIXME: Predicates are fully elaborated in the object type's existential bounds
+            // list. We want to only consider these pre-elaborated projections, and not other
+            // projection predicates that we reach by elaborating the principal trait ref,
+            // since that'll cause ambiguity.
+            //
+            // We can remove this when we have implemented intersections in responses.
+            if assumption.to_opt_poly_projection_pred().is_some()
+                && !own_bounds.contains(&assumption)
+            {
+                continue;
+            }
+
             match G::consider_object_bound_candidate(self, goal, assumption) {
                 Ok(result) => {
                     candidates.push(Candidate { source: CandidateSource::BuiltinImpl, result })