Skip to content

Commit

Permalink
Auto merge of rust-lang#123471 - compiler-errors:match_projection_pro…
Browse files Browse the repository at this point in the history
…jections, r=oli-obk

Check def id before calling `match_projection_projections`

When I "inlined" `assemble_candidates_from_predicates` into `for_each_item_bound` in rust-lang#120584, I forgot to copy over the check that actually made sure the def id of the candidate was equal to the def id of the obligation. This means that we normalize goal a bit too often even if it's not productive to do so.

This PR adds that def id check back.
Fixes rust-lang#123448
  • Loading branch information
bors committed Apr 6, 2024
2 parents 23d47db + 43dae69 commit 8d490e3
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 8d490e3

Please sign in to comment.