From 43dae6934153693be62902fcefed0f97b4ca892f Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Thu, 4 Apr 2024 16:01:06 -0400 Subject: [PATCH] Check def id before calling match_projection_projections --- .../src/traits/project.rs | 3 ++ ...ke-sure-to-filter-projections-by-def-id.rs | 38 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 tests/ui/traits/make-sure-to-filter-projections-by-def-id.rs diff --git a/compiler/rustc_trait_selection/src/traits/project.rs b/compiler/rustc_trait_selection/src/traits/project.rs index 9d744d9a03214..1f7fa6f66437e 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 0000000000000..27a3aad733c22 --- /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: + VectorCommon + Add + Sub +{ +} + +pub trait VectorView<'a>: + VectorOpsByValue + VectorOpsByValue +{ + type Owned; +} + +pub trait Vector: VectorOpsByValue + for<'a> VectorOpsByValue> { + type View<'a>: VectorView<'a, T = Self::T, Owned = Self> + where + Self: 'a; +} + +pub trait MatrixCommon { + type V: Vector; +} + +fn main() {}