Handle multiple trait-def projection candidates

This commit is contained in:
Matthew Jasper 2020-07-25 14:00:13 +01:00
parent 0dfa6ff3be
commit ed32482534
2 changed files with 23 additions and 0 deletions

View File

@ -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;
}
}
}
}

View File

@ -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() {}