mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
Rollup merge of #124724 - compiler-errors:prefer-lower, r=lcnr
Prefer lower vtable candidates in select in new solver Also, adjust the select visitor to only winnow when the *parent* goal is `Certainty::Yes`. This means that we won't winnow in cases when we have any ambiguous inference guidance from two candidates. r? lcnr
This commit is contained in:
commit
2d557ba9f4
@ -58,6 +58,12 @@ impl<'tcx> inspect::ProofTreeVisitor<'tcx> for Select {
|
||||
)));
|
||||
}
|
||||
|
||||
// Don't winnow until `Certainty::Yes` -- we don't need to winnow until
|
||||
// codegen, and only on the good path.
|
||||
if matches!(goal.result().unwrap(), Certainty::Maybe(..)) {
|
||||
return ControlFlow::Break(Ok(None));
|
||||
}
|
||||
|
||||
// We need to winnow. See comments on `candidate_should_be_dropped_in_favor_of`.
|
||||
let mut i = 0;
|
||||
while i < candidates.len() {
|
||||
@ -86,7 +92,7 @@ fn candidate_should_be_dropped_in_favor_of<'tcx>(
|
||||
other: &inspect::InspectCandidate<'_, 'tcx>,
|
||||
) -> bool {
|
||||
// Don't winnow until `Certainty::Yes` -- we don't need to winnow until
|
||||
// codegen, technically.
|
||||
// codegen, and only on the good path.
|
||||
if matches!(other.result().unwrap(), Certainty::Maybe(..)) {
|
||||
return false;
|
||||
}
|
||||
@ -105,12 +111,14 @@ fn candidate_should_be_dropped_in_favor_of<'tcx>(
|
||||
bug!("should not have assembled a CoherenceUnknowable candidate")
|
||||
}
|
||||
|
||||
// In the old trait solver, we arbitrarily choose lower vtable candidates
|
||||
// over higher ones.
|
||||
(
|
||||
CandidateSource::BuiltinImpl(BuiltinImplSource::Object { vtable_base: a }),
|
||||
CandidateSource::BuiltinImpl(BuiltinImplSource::Object { vtable_base: b }),
|
||||
) => a >= b,
|
||||
// Prefer dyn candidates over non-dyn candidates. This is necessary to
|
||||
// handle the unsoundness between `impl<T: ?Sized> Any for T` and `dyn Any: Any`.
|
||||
(
|
||||
CandidateSource::BuiltinImpl(BuiltinImplSource::Object { .. }),
|
||||
CandidateSource::BuiltinImpl(BuiltinImplSource::Object { .. }),
|
||||
) => false,
|
||||
(
|
||||
CandidateSource::Impl(_) | CandidateSource::ParamEnv(_) | CandidateSource::AliasBound,
|
||||
CandidateSource::BuiltinImpl(BuiltinImplSource::Object { .. }),
|
||||
|
@ -4,6 +4,9 @@
|
||||
// comparing the supertrait `Derived<()>` to the expected trait.
|
||||
|
||||
//@ build-pass
|
||||
//@ revisions: current next
|
||||
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||
//@[next] compile-flags: -Znext-solver
|
||||
|
||||
trait Proj {
|
||||
type S;
|
||||
|
Loading…
Reference in New Issue
Block a user