1
Fork 0

Make sure we note ambiguity causes on positive/negative impl conflicts

This commit is contained in:
Michael Goulet 2024-12-22 02:03:11 +00:00
parent 54dcff104b
commit 62d1f4faa1
4 changed files with 54 additions and 9 deletions

View file

@ -483,15 +483,19 @@ fn report_negative_positive_conflict<'tcx>(
negative_impl_def_id: DefId,
positive_impl_def_id: DefId,
) -> ErrorGuaranteed {
tcx.dcx()
.create_err(NegativePositiveConflict {
let mut diag = tcx.dcx().create_err(NegativePositiveConflict {
impl_span: tcx.def_span(local_impl_def_id),
trait_desc: overlap.trait_ref,
self_ty: overlap.self_ty,
negative_impl_span: tcx.span_of_impl(negative_impl_def_id),
positive_impl_span: tcx.span_of_impl(positive_impl_def_id),
})
.emit()
});
for cause in &overlap.intercrate_ambiguity_causes {
cause.add_intercrate_ambiguity_hint(&mut diag);
}
diag.emit()
}
fn report_conflicting_impls<'tcx>(

View file

@ -0,0 +1,14 @@
error[E0119]: conflicting implementations of trait `MyTrait` for type `String`
--> $DIR/ambiguity-cause.rs:10:1
|
LL | impl<T: Copy> MyTrait for T { }
| --------------------------- first implementation here
LL |
LL | impl MyTrait for String { }
| ^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `String`
|
= note: upstream crates may add a new impl of trait `std::marker::Copy` for type `std::string::String` in future versions
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0119`.

View file

@ -0,0 +1,13 @@
//@ revisions: simple negative_coherence
#![feature(negative_impls)]
#![cfg_attr(negative_coherence, feature(with_negative_coherence))]
trait MyTrait {}
impl<T: Copy> MyTrait for T { }
impl MyTrait for String { }
//~^ ERROR conflicting implementations of trait `MyTrait` for type `String`
fn main() {}

View file

@ -0,0 +1,14 @@
error[E0119]: conflicting implementations of trait `MyTrait` for type `String`
--> $DIR/ambiguity-cause.rs:10:1
|
LL | impl<T: Copy> MyTrait for T { }
| --------------------------- first implementation here
LL |
LL | impl MyTrait for String { }
| ^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `String`
|
= note: upstream crates may add a new impl of trait `std::marker::Copy` for type `std::string::String` in future versions
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0119`.