Prefer object candidates over impl candidates in new selection

This commit is contained in:
Michael Goulet 2023-07-06 04:48:33 +00:00
parent bd8aabef31
commit 3acaa568c2
2 changed files with 21 additions and 0 deletions

View File

@ -173,10 +173,18 @@ fn candidate_should_be_dropped_in_favor_of<'tcx>(
victim_idx >= other_idx victim_idx >= other_idx
} }
(_, CandidateSource::ParamEnv(_)) => true, (_, CandidateSource::ParamEnv(_)) => true,
(
CandidateSource::BuiltinImpl(BuiltinImplSource::Object),
CandidateSource::BuiltinImpl(BuiltinImplSource::Object),
) => false,
(_, CandidateSource::BuiltinImpl(BuiltinImplSource::Object)) => true,
(CandidateSource::Impl(victim_def_id), CandidateSource::Impl(other_def_id)) => { (CandidateSource::Impl(victim_def_id), CandidateSource::Impl(other_def_id)) => {
tcx.specializes((other_def_id, victim_def_id)) tcx.specializes((other_def_id, victim_def_id))
&& other.result.value.certainty == Certainty::Yes && other.result.value.certainty == Certainty::Yes
} }
_ => false, _ => false,
} }
} }

View File

@ -0,0 +1,13 @@
// compile-flags: -Ztrait-solver=next
// check-pass
use std::any::Any;
fn needs_usize(_: &usize) {}
fn main() {
let x: &dyn Any = &1usize;
if let Some(x) = x.downcast_ref::<usize>() {
needs_usize(x);
}
}