Skip to content

Commit 319f0b2

Browse files
committed
w
1 parent aeaec5b commit 319f0b2

File tree

1 file changed

+13
-3
lines changed
  • compiler/rustc_trait_selection/src/traits/select

1 file changed

+13
-3
lines changed

compiler/rustc_trait_selection/src/traits/select/mod.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,13 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
474474
}
475475
} else {
476476
let has_non_region_infer = stack.obligation.predicate.has_non_region_infer();
477-
if let Some(candidate) = self.winnow_candidates(has_non_region_infer, candidates) {
477+
let is_default_auto_trait = self
478+
.tcx()
479+
.as_lang_item(stack.obligation.predicate.def_id())
480+
.is_some_and(|lang_item| matches!(lang_item, LangItem::DefaultTrait1));
481+
if let Some(candidate) =
482+
self.winnow_candidates(has_non_region_infer, is_default_auto_trait, candidates)
483+
{
478484
self.filter_reservation_impls(candidate)
479485
} else {
480486
Ok(None)
@@ -1821,15 +1827,19 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
18211827
fn winnow_candidates(
18221828
&mut self,
18231829
has_non_region_infer: bool,
1830+
is_default_auto_trait: bool,
18241831
mut candidates: Vec<EvaluatedCandidate<'tcx>>,
18251832
) -> Option<SelectionCandidate<'tcx>> {
18261833
if candidates.len() == 1 {
18271834
return Some(candidates.pop().unwrap().candidate);
18281835
}
18291836

18301837
// We prefer `Sized` candidates over everything.
1831-
let mut sized_candidates =
1832-
candidates.iter().filter(|c| matches!(c.candidate, SizedCandidate));
1838+
let mut sized_candidates = candidates.iter().filter(|c| {
1839+
matches!(c.candidate, SizedCandidate)
1840+
|| (is_default_auto_trait
1841+
&& matches!(c.candidate, AutoImplCandidate | ImplCandidate(..)))
1842+
});
18331843
if let Some(sized_candidate) = sized_candidates.next() {
18341844
// There should only ever be a single sized candidate
18351845
// as they would otherwise overlap.

0 commit comments

Comments
 (0)