@@ -58,6 +58,12 @@ impl<'tcx> inspect::ProofTreeVisitor<'tcx> for Select {
58
58
) ) ) ;
59
59
}
60
60
61
+ // Don't winnow until `Certainty::Yes` -- we don't need to winnow until
62
+ // codegen, technically, and all goals should hold in codegen.
63
+ if matches ! ( goal. result( ) . unwrap( ) , Certainty :: Maybe ( ..) ) {
64
+ return ControlFlow :: Break ( Ok ( None ) ) ;
65
+ }
66
+
61
67
// We need to winnow. See comments on `candidate_should_be_dropped_in_favor_of`.
62
68
let mut i = 0 ;
63
69
while i < candidates. len ( ) {
@@ -85,8 +91,7 @@ fn candidate_should_be_dropped_in_favor_of<'tcx>(
85
91
victim : & inspect:: InspectCandidate < ' _ , ' tcx > ,
86
92
other : & inspect:: InspectCandidate < ' _ , ' tcx > ,
87
93
) -> bool {
88
- // Don't winnow until `Certainty::Yes` -- we don't need to winnow until
89
- // codegen, technically.
94
+ // codegen, technically, and all goals should hold in codegen.
90
95
if matches ! ( other. result( ) . unwrap( ) , Certainty :: Maybe ( ..) ) {
91
96
return false ;
92
97
}
@@ -105,12 +110,14 @@ fn candidate_should_be_dropped_in_favor_of<'tcx>(
105
110
bug ! ( "should not have assembled a CoherenceUnknowable candidate" )
106
111
}
107
112
113
+ // In the old trait solver, we arbitrarily choose lower vtable candidates
114
+ // over higher ones.
115
+ (
116
+ CandidateSource :: BuiltinImpl ( BuiltinImplSource :: Object { vtable_base : a } ) ,
117
+ CandidateSource :: BuiltinImpl ( BuiltinImplSource :: Object { vtable_base : b } ) ,
118
+ ) => a >= b,
108
119
// Prefer dyn candidates over non-dyn candidates. This is necessary to
109
120
// 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 ,
114
121
(
115
122
CandidateSource :: Impl ( _) | CandidateSource :: ParamEnv ( _) | CandidateSource :: AliasBound ,
116
123
CandidateSource :: BuiltinImpl ( BuiltinImplSource :: Object { .. } ) ,
0 commit comments