@@ -95,25 +95,26 @@ impl Check<'_> {
95
95
96
96
assert_eq ! ( trait_ref_a. trait_id, trait_ref_b. trait_id) ;
97
97
98
- // If the parameters from the two impls cannot be equal, then they do not overlap.
99
- //
100
- // If we can prove `∀P_a, ∀P_b. not (T_a = T_b, Wc_a, Wc_b)`, then they do not overlap.
98
+ // If we can prove that the parameters cannot be equated *or* the where-clauses don't hold,
99
+ // in coherence mode, then they do not overlap.
101
100
if let Ok ( ( ) ) = self . prove_not_goal (
102
101
& env. with_coherence_mode ( true ) ,
103
- ( & a. where_clauses , & b. where_clauses ) ,
104
- Wcs :: all_eq ( & trait_ref_a. parameters , & trait_ref_b. parameters ) ,
102
+ ( ) ,
103
+ (
104
+ Wcs :: all_eq ( & trait_ref_a. parameters , & trait_ref_b. parameters ) ,
105
+ & a. where_clauses ,
106
+ & b. where_clauses ,
107
+ ) ,
105
108
) {
106
- return Ok ( ( ) ) ;
107
- }
109
+ tracing:: debug!(
110
+ "proved not {:?}" ,
111
+ (
112
+ Wcs :: all_eq( & trait_ref_a. parameters, & trait_ref_b. parameters) ,
113
+ & a. where_clauses,
114
+ & b. where_clauses,
115
+ )
116
+ ) ;
108
117
109
- // If we can disprove the where clauses, then they do not overlap.
110
- //
111
- // If we can prove `∀P_a, ∀P_b. not [(T_a = T_b) => (Wc_a, Wc_b)]`, then they do not overlap.
112
- if let Ok ( ( ) ) = self . prove_not_goal (
113
- & env. with_coherence_mode ( true ) ,
114
- Wcs :: all_eq ( & trait_ref_a. parameters , & trait_ref_b. parameters ) ,
115
- ( & a. where_clauses , & b. where_clauses ) ,
116
- ) {
117
118
return Ok ( ( ) ) ;
118
119
}
119
120
@@ -129,18 +130,28 @@ impl Check<'_> {
129
130
. chain ( & b. where_clauses )
130
131
. flat_map ( |wc| wc. invert ( ) )
131
132
. collect ( ) ;
132
- if inverted. iter ( ) . any ( |inverted_wc| {
133
+ if let Some ( inverted_wc ) = inverted. iter ( ) . find ( |inverted_wc| {
133
134
self . prove_goal (
134
135
& env,
135
136
(
136
137
Wcs :: all_eq ( & trait_ref_a. parameters , & trait_ref_b. parameters ) ,
137
138
& a. where_clauses ,
138
139
& b. where_clauses ,
139
140
) ,
140
- inverted_wc,
141
+ & inverted_wc,
141
142
)
142
143
. is_ok ( )
143
144
} ) {
145
+ tracing:: debug!(
146
+ "proved {:?} assuming {:?}" ,
147
+ & inverted_wc,
148
+ (
149
+ Wcs :: all_eq( & trait_ref_a. parameters, & trait_ref_b. parameters) ,
150
+ & a. where_clauses,
151
+ & b. where_clauses,
152
+ )
153
+ ) ;
154
+
144
155
return Ok ( ( ) ) ;
145
156
}
146
157
bail ! ( "impls may overlap: `{impl_a:?}` vs `{impl_b:?}`" )
0 commit comments