| //! Ensure that a `const fn` can match on constants of a type that is `PartialEq` | 
 | //! but not `const PartialEq`. This is accepted for backwards compatibility reasons. | 
 | //@ check-pass | 
 | #![feature(const_trait_impl)] | 
 |  | 
 | #[derive(Eq, PartialEq)] | 
 | pub struct Y(u8); | 
 | pub const GREEN: Y = Y(4); | 
 | pub const fn is_green(x: Y) -> bool { | 
 |     match x { GREEN => true, _ => false } | 
 | } | 
 |  | 
 | struct CustomEq; | 
 |  | 
 | impl Eq for CustomEq {} | 
 | impl PartialEq for CustomEq { | 
 |     fn eq(&self, _: &Self) -> bool { | 
 |         false | 
 |     } | 
 | } | 
 |  | 
 | #[derive(PartialEq, Eq)] | 
 | #[allow(unused)] | 
 | enum Foo { | 
 |     Bar, | 
 |     Baz, | 
 |     Qux(CustomEq), | 
 | } | 
 |  | 
 | const BAR_BAZ: Foo = if 42 == 42 { | 
 |     Foo::Bar | 
 | } else { | 
 |     Foo::Qux(CustomEq) // dead arm | 
 | }; | 
 |  | 
 | const EMPTY: &[CustomEq] = &[]; | 
 |  | 
 | const fn test() { | 
 |     // BAR_BAZ itself is fine but the enum has other variants | 
 |     // that are non-structural. Still, this should be accepted. | 
 |     match Foo::Qux(CustomEq) { | 
 |         BAR_BAZ => panic!(), | 
 |         _ => {} | 
 |     } | 
 |  | 
 |     // Similarly, an empty slice of a type that is non-structural | 
 |     // is accepted. | 
 |     match &[CustomEq] as &[CustomEq] { | 
 |         EMPTY => panic!(), | 
 |         _ => {}, | 
 |     } | 
 | } | 
 |  | 
 | fn main() {} |