#[macro_use] extern crate derivative; #[derive(Derivative, PartialEq)] #[derivative(Eq)] struct Foo { foo: u8 } #[derive(Derivative)] #[derivative(Eq)] struct WithPtr { #[derivative(Eq(bound=""))] foo: *const T } impl PartialEq for WithPtr { fn eq(&self, other: &Self) -> bool { self.foo == other.foo } } trait SomeTrait {} struct SomeType { #[allow(dead_code)] foo: u8 } impl SomeTrait for SomeType {} fn assert_eq(_: T) {} #[test] fn main() { assert!(Foo { foo: 7 } == Foo { foo: 7 }); assert!(Foo { foo: 7 } != Foo { foo: 42 }); assert_eq(Foo { foo: 7 }); let ptr1: *const SomeTrait = &SomeType { foo: 0 }; let ptr2: *const SomeTrait = &SomeType { foo: 1 }; assert!(WithPtr { foo: ptr1 } == WithPtr { foo: ptr1 }); assert!(WithPtr { foo: ptr1 } != WithPtr { foo: ptr2 }); assert_eq(WithPtr { foo: ptr1 }); }