Check def id before calling match_projection_projections
This commit is contained in:
parent
0fd571286e
commit
43dae69341
@ -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));
|
||||
|
38
tests/ui/traits/make-sure-to-filter-projections-by-def-id.rs
Normal file
38
tests/ui/traits/make-sure-to-filter-projections-by-def-id.rs
Normal file
@ -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() {}
|
Loading…
Reference in New Issue
Block a user