Skip to content

Commit 4a40c55

Browse files
committed
impl_or_trait_obligations: deduplicate obligations
1 parent 3d81698 commit 4a40c55

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

src/librustc/traits/select.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -3282,7 +3282,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
32823282
// that order.
32833283
let predicates = tcx.predicates_of(def_id);
32843284
assert_eq!(predicates.parent, None);
3285-
let predicates = predicates.predicates.iter().flat_map(|predicate| {
3285+
let mut predicates: Vec<_> = predicates.predicates.iter().flat_map(|predicate| {
32863286
let predicate = normalize_with_depth(self, param_env, cause.clone(), recursion_depth,
32873287
&predicate.subst(tcx, substs));
32883288
predicate.obligations.into_iter().chain(
@@ -3293,6 +3293,17 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
32933293
predicate: predicate.value
32943294
}))
32953295
}).collect();
3296+
if predicates.len() > 1 {
3297+
let mut i = 0;
3298+
while i != predicates.len() {
3299+
let has_dup = (0..i).any(|j| predicates[i] == predicates[j]);
3300+
if has_dup {
3301+
predicates.swap_remove(i);
3302+
} else {
3303+
i += 1;
3304+
}
3305+
}
3306+
}
32963307
self.infcx().plug_leaks(skol_map, snapshot, predicates)
32973308
}
32983309
}

0 commit comments

Comments
 (0)