Skip to content

Commit a4ee20e

Browse files
Prefer lower vtable candidates in select in new solver
1 parent d568423 commit a4ee20e

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

compiler/rustc_trait_selection/src/solve/eval_ctxt/select.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ impl<'tcx> inspect::ProofTreeVisitor<'tcx> for Select {
5858
)));
5959
}
6060

61+
// Don't winnow until `Certainty::Yes` -- we don't need to winnow until
62+
// codegen, and only on the good path.
63+
if matches!(goal.result().unwrap(), Certainty::Maybe(..)) {
64+
return ControlFlow::Break(Ok(None));
65+
}
66+
6167
// We need to winnow. See comments on `candidate_should_be_dropped_in_favor_of`.
6268
let mut i = 0;
6369
while i < candidates.len() {
@@ -86,7 +92,7 @@ fn candidate_should_be_dropped_in_favor_of<'tcx>(
8692
other: &inspect::InspectCandidate<'_, 'tcx>,
8793
) -> bool {
8894
// Don't winnow until `Certainty::Yes` -- we don't need to winnow until
89-
// codegen, technically.
95+
// codegen, and only on the good path.
9096
if matches!(other.result().unwrap(), Certainty::Maybe(..)) {
9197
return false;
9298
}
@@ -105,12 +111,14 @@ fn candidate_should_be_dropped_in_favor_of<'tcx>(
105111
bug!("should not have assembled a CoherenceUnknowable candidate")
106112
}
107113

114+
// In the old trait solver, we arbitrarily choose lower vtable candidates
115+
// over higher ones.
116+
(
117+
CandidateSource::BuiltinImpl(BuiltinImplSource::Object { vtable_base: a }),
118+
CandidateSource::BuiltinImpl(BuiltinImplSource::Object { vtable_base: b }),
119+
) => a >= b,
108120
// Prefer dyn candidates over non-dyn candidates. This is necessary to
109121
// handle the unsoundness between `impl<T: ?Sized> Any for T` and `dyn Any: Any`.
110-
(
111-
CandidateSource::BuiltinImpl(BuiltinImplSource::Object { .. }),
112-
CandidateSource::BuiltinImpl(BuiltinImplSource::Object { .. }),
113-
) => false,
114122
(
115123
CandidateSource::Impl(_) | CandidateSource::ParamEnv(_) | CandidateSource::AliasBound,
116124
CandidateSource::BuiltinImpl(BuiltinImplSource::Object { .. }),

tests/ui/traits/normalize-supertrait.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
// comparing the supertrait `Derived<()>` to the expected trait.
55

66
//@ build-pass
7+
//@ revisions: current next
8+
//@ ignore-compare-mode-next-solver (explicit revisions)
9+
//@[next] compile-flags: -Znext-solver
710

811
trait Proj {
912
type S;

0 commit comments

Comments
 (0)