about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_trait_selection/src/traits/project.rs3
-rw-r--r--tests/ui/traits/make-sure-to-filter-projections-by-def-id.rs38
2 files changed, 41 insertions, 0 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/project.rs b/compiler/rustc_trait_selection/src/traits/project.rs
index 9246a41a2bc..56b25b0fe6c 100644
--- a/compiler/rustc_trait_selection/src/traits/project.rs
+++ b/compiler/rustc_trait_selection/src/traits/project.rs
@@ -793,6 +793,9 @@ fn assemble_candidates_from_trait_def<'cx, 'tcx>(
             let Some(clause) = clause.as_projection_clause() else {
                 return ControlFlow::Continue(());
             };
+            if clause.projection_def_id() != obligation.predicate.def_id {
+                return ControlFlow::Continue(());
+            }
 
             let is_match =
                 selcx.infcx.probe(|_| selcx.match_projection_projections(obligation, clause, true));
diff --git a/tests/ui/traits/make-sure-to-filter-projections-by-def-id.rs b/tests/ui/traits/make-sure-to-filter-projections-by-def-id.rs
new file mode 100644
index 00000000000..27a3aad733c
--- /dev/null
+++ b/tests/ui/traits/make-sure-to-filter-projections-by-def-id.rs
@@ -0,0 +1,38 @@
+//@ check-pass
+
+#![recursion_limit = "1024"]
+// Really high recursion limit ^
+
+// Test that ensures we're filtering projections by def id before matching
+// them in `match_projection_projections`.
+
+use std::ops::{Add, Sub};
+
+pub trait Scalar {}
+
+pub trait VectorCommon: Sized {
+    type T: Scalar;
+}
+
+pub trait VectorOpsByValue<Rhs = Self, Output = Self>:
+    VectorCommon + Add<Rhs, Output = Output> + Sub<Rhs, Output = Output>
+{
+}
+
+pub trait VectorView<'a>:
+    VectorOpsByValue<Self, Self::Owned> + VectorOpsByValue<Self::Owned, Self::Owned>
+{
+    type Owned;
+}
+
+pub trait Vector: VectorOpsByValue<Self> + for<'a> VectorOpsByValue<Self::View<'a>> {
+    type View<'a>: VectorView<'a, T = Self::T, Owned = Self>
+    where
+        Self: 'a;
+}
+
+pub trait MatrixCommon {
+    type V: Vector;
+}
+
+fn main() {}