Skip to content

Commit

Permalink
Handle multiple trait-def projection candidates
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewjasper committed Oct 6, 2020
1 parent 0dfa6ff commit ed32482
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
7 changes: 7 additions & 0 deletions compiler/rustc_trait_selection/src/traits/project.rs
Expand Up @@ -977,6 +977,13 @@ fn assemble_candidates_from_predicates<'cx, 'tcx>(

if is_match {
candidate_set.push_candidate(ctor(data));

if potentially_unnormalized_candidates && !obligation.predicate.needs_infer() {
// HACK: Pick the first trait def candidate for a fully
// inferred predicate. This is to allow duplicates that
// differ only in normalization.
return;
}
}
}
}
Expand Down
@@ -0,0 +1,16 @@
// Check that if we have multiple applicable projection bounds we pick one (for
// backwards compatibility reasons).

// check-pass
use std::ops::Mul;

trait A {
type V;
type U: Mul<Self::V, Output = ()> + Mul<(), Output = ()>;
}

fn g<T: A<V = ()>>() {
let y: <T::U as Mul<()>>::Output = ();
}

fn main() {}

0 comments on commit ed32482

Please sign in to comment.