Skip to content

Commit

Permalink
Check def id before calling match_projection_projections
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Apr 4, 2024
1 parent 0fd5712 commit 43dae69
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
3 changes: 3 additions & 0 deletions compiler/rustc_trait_selection/src/traits/project.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
38 changes: 38 additions & 0 deletions tests/ui/traits/make-sure-to-filter-projections-by-def-id.rs
Original file line number Diff line number Diff line change
@@ -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() {}

0 comments on commit 43dae69

Please sign in to comment.