Make sure we note ambiguity causes on positive/negative impl conflicts
This commit is contained in:
parent
54dcff104b
commit
62d1f4faa1
4 changed files with 54 additions and 9 deletions
|
@ -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>(
|
||||
|
|
|
@ -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`.
|
13
tests/ui/traits/negative-impls/ambiguity-cause.rs
Normal file
13
tests/ui/traits/negative-impls/ambiguity-cause.rs
Normal 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() {}
|
14
tests/ui/traits/negative-impls/ambiguity-cause.simple.stderr
Normal file
14
tests/ui/traits/negative-impls/ambiguity-cause.simple.stderr
Normal 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`.
|
Loading…
Add table
Add a link
Reference in a new issue