Auto merge of #123674 - oli-obk:bogus_note, r=estebank

Silence some follow-up errors on trait impls in case the trait has conflicting or otherwise incoherent impls

fixes #123292

Also removes a bunch of extra diagnostics that were introduced in https://github.com/rust-lang/rust/pull/121154 and https://github.com/rust-lang/rust/pull/120558
This commit is contained in:
bors 2024-04-17 14:25:10 +00:00
commit 00ed4edb44
11 changed files with 55 additions and 109 deletions

View file

@ -660,10 +660,16 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) {
} }
DefKind::Impl { of_trait } => { DefKind::Impl { of_trait } => {
if of_trait && let Some(impl_trait_header) = tcx.impl_trait_header(def_id) { if of_trait && let Some(impl_trait_header) = tcx.impl_trait_header(def_id) {
if tcx
.ensure()
.coherent_trait(impl_trait_header.trait_ref.instantiate_identity().def_id)
.is_ok()
{
check_impl_items_against_trait(tcx, def_id, impl_trait_header); check_impl_items_against_trait(tcx, def_id, impl_trait_header);
check_on_unimplemented(tcx, def_id); check_on_unimplemented(tcx, def_id);
} }
} }
}
DefKind::Trait => { DefKind::Trait => {
let assoc_items = tcx.associated_items(def_id); let assoc_items = tcx.associated_items(def_id);
check_on_unimplemented(tcx, def_id); check_on_unimplemented(tcx, def_id);

View file

@ -22,8 +22,7 @@ struct MyType {
impl MyTrait<MyType> for MyType { impl MyTrait<MyType> for MyType {
//~^ ERROR E0119 //~^ ERROR E0119
fn get(&self) -> usize { (*self).clone() } fn get(&self) -> usize { (*self).clone() }
//~^ ERROR incompatible type //~^ ERROR mismatched types
//~| ERROR mismatched types
} }
fn main() { } fn main() { }

View file

@ -7,23 +7,6 @@ LL | impl<T> MyTrait<T> for T {
LL | impl MyTrait<MyType> for MyType { LL | impl MyTrait<MyType> for MyType {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `MyType` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `MyType`
error[E0053]: method `get` has an incompatible type for trait
--> $DIR/coherence-blanket-conflicts-with-specific-multidispatch.rs:24:22
|
LL | fn get(&self) -> usize { (*self).clone() }
| ^^^^^
| |
| expected `MyType`, found `usize`
| help: change the output type to match the trait: `MyType`
|
note: type in trait
--> $DIR/coherence-blanket-conflicts-with-specific-multidispatch.rs:8:22
|
LL | fn get(&self) -> T;
| ^
= note: expected signature `fn(&MyType) -> MyType`
found signature `fn(&MyType) -> usize`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/coherence-blanket-conflicts-with-specific-multidispatch.rs:24:30 --> $DIR/coherence-blanket-conflicts-with-specific-multidispatch.rs:24:30
| |
@ -32,7 +15,7 @@ LL | fn get(&self) -> usize { (*self).clone() }
| | | |
| expected `usize` because of return type | expected `usize` because of return type
error: aborting due to 3 previous errors error: aborting due to 2 previous errors
Some errors have detailed explanations: E0053, E0119, E0308. Some errors have detailed explanations: E0119, E0308.
For more information about an error, try `rustc --explain E0053`. For more information about an error, try `rustc --explain E0119`.

View file

@ -9,13 +9,10 @@ struct TheType;
impl TheTrait<usize> for isize {} impl TheTrait<usize> for isize {}
//~^ ERROR E0117 //~^ ERROR E0117
//~| ERROR not all trait items implemented
impl TheTrait<TheType> for isize {} impl TheTrait<TheType> for isize {}
//~^ ERROR not all trait items implemented
impl TheTrait<isize> for TheType {} impl TheTrait<isize> for TheType {}
//~^ ERROR not all trait items implemented
impl !Send for Vec<isize> {} //~ ERROR E0117 impl !Send for Vec<isize> {} //~ ERROR E0117

View file

@ -10,32 +10,8 @@ LL | impl TheTrait<usize> for isize {}
| |
= note: define and implement a trait or new type instead = note: define and implement a trait or new type instead
error[E0046]: not all trait items implemented, missing: `the_fn`
--> $DIR/coherence-orphan.rs:10:1
|
LL | impl TheTrait<usize> for isize {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `the_fn` in implementation
|
= help: implement the missing item: `fn the_fn(&self) { todo!() }`
error[E0046]: not all trait items implemented, missing: `the_fn`
--> $DIR/coherence-orphan.rs:14:1
|
LL | impl TheTrait<TheType> for isize {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `the_fn` in implementation
|
= help: implement the missing item: `fn the_fn(&self) { todo!() }`
error[E0046]: not all trait items implemented, missing: `the_fn`
--> $DIR/coherence-orphan.rs:17:1
|
LL | impl TheTrait<isize> for TheType {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `the_fn` in implementation
|
= help: implement the missing item: `fn the_fn(&self) { todo!() }`
error[E0117]: only traits defined in the current crate can be implemented for types defined outside of the crate error[E0117]: only traits defined in the current crate can be implemented for types defined outside of the crate
--> $DIR/coherence-orphan.rs:20:1 --> $DIR/coherence-orphan.rs:17:1
| |
LL | impl !Send for Vec<isize> {} LL | impl !Send for Vec<isize> {}
| ^^^^^^^^^^^^^^^---------- | ^^^^^^^^^^^^^^^----------
@ -45,7 +21,6 @@ LL | impl !Send for Vec<isize> {}
| |
= note: define and implement a trait or new type instead = note: define and implement a trait or new type instead
error: aborting due to 5 previous errors error: aborting due to 2 previous errors
Some errors have detailed explanations: E0046, E0117. For more information about this error, try `rustc --explain E0117`.
For more information about an error, try `rustc --explain E0046`.

View file

@ -1,5 +1,4 @@
impl Drop for u32 {} //~ ERROR E0117 impl Drop for u32 {} //~ ERROR E0117
//~| ERROR the `Drop` trait may only be implemented for local structs, enums, and unions //~| ERROR the `Drop` trait may only be implemented for local structs, enums, and unions
//~| ERROR not all trait items implemented
fn main() {} fn main() {}

View file

@ -15,15 +15,7 @@ error[E0120]: the `Drop` trait may only be implemented for local structs, enums,
LL | impl Drop for u32 {} LL | impl Drop for u32 {}
| ^^^ must be a struct, enum, or union in the current crate | ^^^ must be a struct, enum, or union in the current crate
error[E0046]: not all trait items implemented, missing: `drop` error: aborting due to 2 previous errors
--> $DIR/E0117.rs:1:1
|
LL | impl Drop for u32 {}
| ^^^^^^^^^^^^^^^^^ missing `drop` in implementation
|
= help: implement the missing item: `fn drop(&mut self) { todo!() }`
error: aborting due to 3 previous errors Some errors have detailed explanations: E0117, E0120.
For more information about an error, try `rustc --explain E0117`.
Some errors have detailed explanations: E0046, E0117, E0120.
For more information about an error, try `rustc --explain E0046`.

View file

@ -2,21 +2,21 @@ fn main() {}
impl std::ops::AddAssign for () { impl std::ops::AddAssign for () {
//~^ ERROR only traits defined in the current crate can be implemented for arbitrary types //~^ ERROR only traits defined in the current crate can be implemented for arbitrary types
fn add_assign(&self, other: ()) -> () { //~ ERROR incompatible type fn add_assign(&self, other: ()) -> () {
() ()
} }
} }
impl std::ops::AddAssign for [(); 1] { impl std::ops::AddAssign for [(); 1] {
//~^ ERROR only traits defined in the current crate can be implemented for arbitrary types //~^ ERROR only traits defined in the current crate can be implemented for arbitrary types
fn add_assign(&self, other: [(); 1]) -> [(); 1] { //~ ERROR incompatible type fn add_assign(&self, other: [(); 1]) -> [(); 1] {
[()] [()]
} }
} }
impl std::ops::AddAssign for &[u8] { impl std::ops::AddAssign for &[u8] {
//~^ ERROR only traits defined in the current crate can be implemented for arbitrary types //~^ ERROR only traits defined in the current crate can be implemented for arbitrary types
fn add_assign(&self, other: &[u8]) -> &[u8] { //~ ERROR incompatible type fn add_assign(&self, other: &[u8]) -> &[u8] {
self self
} }
} }

View file

@ -34,43 +34,6 @@ LL | impl std::ops::AddAssign for &[u8] {
| |
= note: define and implement a trait or new type instead = note: define and implement a trait or new type instead
error[E0053]: method `add_assign` has an incompatible type for trait error: aborting due to 3 previous errors
--> $DIR/issue-67535.rs:5:19
|
LL | fn add_assign(&self, other: ()) -> () {
| ^^^^^
| |
| types differ in mutability
| help: change the self-receiver type to match the trait: `&mut self`
|
= note: expected signature `fn(&mut (), ())`
found signature `fn(&(), ())`
error[E0053]: method `add_assign` has an incompatible type for trait For more information about this error, try `rustc --explain E0117`.
--> $DIR/issue-67535.rs:12:19
|
LL | fn add_assign(&self, other: [(); 1]) -> [(); 1] {
| ^^^^^
| |
| types differ in mutability
| help: change the self-receiver type to match the trait: `&mut self`
|
= note: expected signature `fn(&mut _, _)`
found signature `fn(&_, _) -> [(); 1]`
error[E0053]: method `add_assign` has an incompatible type for trait
--> $DIR/issue-67535.rs:19:19
|
LL | fn add_assign(&self, other: &[u8]) -> &[u8] {
| ^^^^^
| |
| types differ in mutability
| help: change the self-receiver type to match the trait: `&mut self`
|
= note: expected signature `fn(&mut &_, &_)`
found signature `fn(&&_, &_) -> &[u8]`
error: aborting due to 6 previous errors
Some errors have detailed explanations: E0053, E0117.
For more information about an error, try `rustc --explain E0053`.

View file

@ -0,0 +1,20 @@
//@ edition: 2021
struct Ty;
impl TryFrom<Ty> for u8 {
type Error = Ty;
fn try_from(_: Ty) -> Result<Self, Self::Error> {
loop {}
}
}
impl TryFrom<Ty> for u8 {
//~^ ERROR conflicting implementations of trait
type Error = Ty;
fn try_from(_: Ty) -> Result<Self, Self::Error> {
loop {}
}
}
fn main() {}

View file

@ -0,0 +1,12 @@
error[E0119]: conflicting implementations of trait `TryFrom<Ty>` for type `u8`
--> $DIR/conflicting-impls.rs:12:1
|
LL | impl TryFrom<Ty> for u8 {
| ----------------------- first implementation here
...
LL | impl TryFrom<Ty> for u8 {
| ^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `u8`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0119`.