| // Second case reported in issue #108894. | |
| use std::marker::PhantomData; | |
| #[derive(PartialEq, Eq)] | |
| pub struct Id<T>(PhantomData<T>); | |
| // manual implementation which would break the usage of const patterns | |
| // impl<T> PartialEq for Id<T> { fn eq(&self, _: &Id<T>) -> bool { true } } | |
| // impl<T> Eq for Id<T> {} | |
| // This derive is undesired but cannot be removed without | |
| // breaking the usages below | |
| // #[derive(PartialEq, Eq)] | |
| struct SomeNode(); | |
| fn accept_eq(_: &impl PartialEq) { } | |
| fn main() { | |
| let node = Id::<SomeNode>(PhantomData); | |
| // this will only work if | |
| // - `Partial/Eq` is implemented manually, or | |
| // - `SomeNode` also needlessly(?) implements `Partial/Eq` | |
| accept_eq(&node); //~ ERROR can't compare `SomeNode` with `SomeNode` | |
| const CONST_ID: Id::<SomeNode> = Id::<SomeNode>(PhantomData); | |
| // this will work only when `Partial/Eq` is being derived | |
| // otherwise: error: to use a constant of type `Id<SomeNode>` in a pattern, | |
| // `Id<SomeNode>` must be annotated with `#[derive(PartialEq, Eq)]` | |
| match node { | |
| CONST_ID => {} | |
| } | |
| } |