Skip to content

Commit fed7b2b

Browse files
lcnrcuviper
authored andcommitted
avoid running the overlap check twice
(cherry picked from commit ebbcfd4)
1 parent 558d43b commit fed7b2b

File tree

3 files changed

+33
-26
lines changed

3 files changed

+33
-26
lines changed

compiler/rustc_trait_selection/src/traits/coherence.rs

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -117,28 +117,39 @@ pub fn overlapping_impls(
117117
return None;
118118
}
119119

120-
let _overlap_with_bad_diagnostics = overlap(
121-
tcx,
122-
TrackAmbiguityCauses::No,
123-
skip_leak_check,
124-
impl1_def_id,
125-
impl2_def_id,
126-
overlap_mode,
127-
)?;
128-
129-
// In the case where we detect an error, run the check again, but
130-
// this time tracking intercrate ambiguity causes for better
131-
// diagnostics. (These take time and can lead to false errors.)
132-
let overlap = overlap(
133-
tcx,
134-
TrackAmbiguityCauses::Yes,
135-
skip_leak_check,
136-
impl1_def_id,
137-
impl2_def_id,
138-
overlap_mode,
139-
)
140-
.unwrap();
141-
Some(overlap)
120+
if tcx.next_trait_solver_in_coherence() {
121+
overlap(
122+
tcx,
123+
TrackAmbiguityCauses::Yes,
124+
skip_leak_check,
125+
impl1_def_id,
126+
impl2_def_id,
127+
overlap_mode,
128+
)
129+
} else {
130+
let _overlap_with_bad_diagnostics = overlap(
131+
tcx,
132+
TrackAmbiguityCauses::No,
133+
skip_leak_check,
134+
impl1_def_id,
135+
impl2_def_id,
136+
overlap_mode,
137+
)?;
138+
139+
// In the case where we detect an error, run the check again, but
140+
// this time tracking intercrate ambiguity causes for better
141+
// diagnostics. (These take time and can lead to false errors.)
142+
let overlap = overlap(
143+
tcx,
144+
TrackAmbiguityCauses::Yes,
145+
skip_leak_check,
146+
impl1_def_id,
147+
impl2_def_id,
148+
overlap_mode,
149+
)
150+
.unwrap();
151+
Some(overlap)
152+
}
142153
}
143154

144155
fn fresh_impl_header<'tcx>(infcx: &InferCtxt<'tcx>, impl_def_id: DefId) -> ty::ImplHeader<'tcx> {

tests/ui/coherence/occurs-check/associated-type.next.stderr

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
22
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
3-
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
4-
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
53
error[E0119]: conflicting implementations of trait `Overlap<for<'a> fn(&'a (), ())>` for type `for<'a> fn(&'a (), ())`
64
--> $DIR/associated-type.rs:32:1
75
|

tests/ui/coherence/occurs-check/associated-type.old.stderr

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
22
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
3-
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
4-
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
53
error[E0119]: conflicting implementations of trait `Overlap<for<'a> fn(&'a (), ())>` for type `for<'a> fn(&'a (), ())`
64
--> $DIR/associated-type.rs:32:1
75
|

0 commit comments

Comments
 (0)