| //! 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() {} |