Skip to content

Commit

Permalink
Rollup merge of rust-lang#134639 - compiler-errors:negative-ambiguity…
Browse files Browse the repository at this point in the history
…-causes, r=oli-obk

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

Fixes rust-lang#134632 by explaining why the error must be
  • Loading branch information
matthiaskrgr authored Dec 22, 2024
2 parents a8edf08 + 62d1f4f commit 4d166cc
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 9 deletions.
22 changes: 13 additions & 9 deletions compiler/rustc_trait_selection/src/traits/specialize/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
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()
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),
});

for cause in &overlap.intercrate_ambiguity_causes {
cause.add_intercrate_ambiguity_hint(&mut diag);
}

diag.emit()
}

fn report_conflicting_impls<'tcx>(
Expand Down
Original file line number Diff line number Diff line change
@@ -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 changes: 13 additions & 0 deletions tests/ui/traits/negative-impls/ambiguity-cause.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 14 additions & 0 deletions tests/ui/traits/negative-impls/ambiguity-cause.simple.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 4d166cc

Please sign in to comment.