// rust-lang/rust#62614: we want to allow matching on constants of types that // have non-structural-match variants, *if* the constant itself does not use // any such variant. // NOTE: for now, deliberately leaving the lint `indirect_structural_match` set // to its default, so that we will not issue a diangostic even if // rust-lang/rust#62614 remains an open issue. // run-pass struct Sum(u32, u32); impl PartialEq for Sum { fn eq(&self, other: &Self) -> bool { self.0 + self.1 == other.0 + other.1 } } impl Eq for Sum { } #[derive(PartialEq, Eq)] enum Eek { TheConst, UnusedByTheConst(Sum) } const THE_CONST: Eek = Eek::TheConst; const SUM_THREE: Eek = Eek::UnusedByTheConst(Sum(3,0)); const EEK_ZERO: &[Eek] = &[]; const EEK_ONE: &[Eek] = &[THE_CONST]; pub fn main() { match Eek::UnusedByTheConst(Sum(1,2)) { ref sum if sum == &SUM_THREE => { println!("Hello 0"); } _ => { println!("Gbye"); } } match Eek::TheConst { THE_CONST => { println!("Hello 1"); } _ => { println!("Gbye"); } } match & &Eek::TheConst { & & THE_CONST => { println!("Hello 2"); } _ => { println!("Gbye"); } } match & & &[][..] { & & EEK_ZERO => { println!("Hello 3"); } & & EEK_ONE => { println!("Gbye"); } _ => { println!("Gbye"); } } match & & &[Eek::TheConst][..] { & & EEK_ZERO => { println!("Gby"); } & & EEK_ONE => { println!("Hello 4"); } _ => { println!("Gbye"); } } }