Open
Description
Given the following code:
enum ETest {}
impl ToString for ETest {
fn to_string(&self) -> String { String::new() }
}
#[derive(PartialEq)]
struct Props {
to: ETest
}
impl PartialEq<String> for ETest {
fn eq(&self, other: &String) -> bool { true }
}
struct Test {
props: Props
}
trait Foo {
type TProps: PartialEq;
}
impl Foo for Test {
type TProps = Props;
}
The current output is:
error[E0308]: mismatched types
--> src/lib.rs:9:5
|
9 | to: ETest
| ^^^^^^^^^
| |
| expected struct `String`, found enum `ETest`
| help: try using a conversion method: `(to: ETest).to_string()`
|
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
If we replace our code with compiler's suggestion, we end up with this code:
#[derive(PartialEq)]
struct Props {
(to: ETest).to_string()
}
Which is invalid Rust.
I've only observed this happen with PartialEq<Type>
and ToString
being implemented.
Related to: #63564
#63564 makes this error message even worse as it isn't obvious what's actually wrong here.
I reproduced this with today's nightly build (2021-03-19 f5f33ec0e0455eefa72f
)
Playground link: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=7ac536d0521cefa0cf1f088b9d88db1f