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,
|
negative_impl_def_id: DefId,
|
||||||
positive_impl_def_id: DefId,
|
positive_impl_def_id: DefId,
|
||||||
) -> ErrorGuaranteed {
|
) -> ErrorGuaranteed {
|
||||||
tcx.dcx()
|
let mut diag = tcx.dcx().create_err(NegativePositiveConflict {
|
||||||
.create_err(NegativePositiveConflict {
|
impl_span: tcx.def_span(local_impl_def_id),
|
||||||
impl_span: tcx.def_span(local_impl_def_id),
|
trait_desc: overlap.trait_ref,
|
||||||
trait_desc: overlap.trait_ref,
|
self_ty: overlap.self_ty,
|
||||||
self_ty: overlap.self_ty,
|
negative_impl_span: tcx.span_of_impl(negative_impl_def_id),
|
||||||
negative_impl_span: tcx.span_of_impl(negative_impl_def_id),
|
positive_impl_span: tcx.span_of_impl(positive_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>(
|
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