Auto merge of #84944 - lcnr:obligation-dedup, r=jackh726
remove obligation dedup from `impl_or_trait_obligations` Looking at the examples from #38528 they all seem to compile fine even without this and it seems like this might be unnecessary effort
This commit is contained in:
commit
32cbc7630b
1 changed files with 0 additions and 22 deletions
|
@ -2374,28 +2374,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
});
|
||||
}
|
||||
|
||||
// We are performing deduplication here to avoid exponential blowups
|
||||
// (#38528) from happening, but the real cause of the duplication is
|
||||
// unknown. What we know is that the deduplication avoids exponential
|
||||
// amount of predicates being propagated when processing deeply nested
|
||||
// types.
|
||||
//
|
||||
// This code is hot enough that it's worth avoiding the allocation
|
||||
// required for the FxHashSet when possible. Special-casing lengths 0,
|
||||
// 1 and 2 covers roughly 75-80% of the cases.
|
||||
if obligations.len() <= 1 {
|
||||
// No possibility of duplicates.
|
||||
} else if obligations.len() == 2 {
|
||||
// Only two elements. Drop the second if they are equal.
|
||||
if obligations[0] == obligations[1] {
|
||||
obligations.truncate(1);
|
||||
}
|
||||
} else {
|
||||
// Three or more elements. Use a general deduplication process.
|
||||
let mut seen = FxHashSet::default();
|
||||
obligations.retain(|i| seen.insert(i.clone()));
|
||||
}
|
||||
|
||||
obligations
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue