|
| 1 | +// rust-lang/rust#62614: we want to allow matching on constants of types that |
| 2 | +// have non-structural-match variants, *if* the constant itself does not use |
| 3 | +// any such variant. |
| 4 | + |
| 5 | +// NOTE: for now, deliberately leaving the lint `indirect_structural_match` set |
| 6 | +// to its default, so that we will not issue a diangostic even if |
| 7 | +// rust-lang/rust#62614 remains an open issue. |
| 8 | + |
| 9 | +// run-pass |
| 10 | + |
| 11 | +struct Sum(u32, u32); |
| 12 | + |
| 13 | +impl PartialEq for Sum { |
| 14 | + fn eq(&self, other: &Self) -> bool { self.0 + self.1 == other.0 + other.1 } |
| 15 | +} |
| 16 | + |
| 17 | +impl Eq for Sum { } |
| 18 | + |
| 19 | +#[derive(PartialEq, Eq)] |
| 20 | +enum Eek { |
| 21 | + TheConst, |
| 22 | + UnusedByTheConst(Sum) |
| 23 | +} |
| 24 | + |
| 25 | +const THE_CONST: Eek = Eek::TheConst; |
| 26 | +const SUM_THREE: Eek = Eek::UnusedByTheConst(Sum(3,0)); |
| 27 | + |
| 28 | +const EEK_ZERO: &[Eek] = &[]; |
| 29 | +const EEK_ONE: &[Eek] = &[THE_CONST]; |
| 30 | + |
| 31 | +pub fn main() { |
| 32 | + match Eek::UnusedByTheConst(Sum(1,2)) { |
| 33 | + ref sum if sum == &SUM_THREE => { println!("Hello 0"); } |
| 34 | + _ => { println!("Gbye"); } |
| 35 | + } |
| 36 | + |
| 37 | + match Eek::TheConst { |
| 38 | + THE_CONST => { println!("Hello 1"); } |
| 39 | + _ => { println!("Gbye"); } |
| 40 | + } |
| 41 | + |
| 42 | + |
| 43 | + match & &Eek::TheConst { |
| 44 | + & & THE_CONST => { println!("Hello 2"); } |
| 45 | + _ => { println!("Gbye"); } |
| 46 | + } |
| 47 | + |
| 48 | + match & & &[][..] { |
| 49 | + & & EEK_ZERO => { println!("Hello 3"); } |
| 50 | + & & EEK_ONE => { println!("Gbye"); } |
| 51 | + _ => { println!("Gbye"); } |
| 52 | + } |
| 53 | + |
| 54 | + match & & &[Eek::TheConst][..] { |
| 55 | + & & EEK_ZERO => { println!("Gby"); } |
| 56 | + & & EEK_ONE => { println!("Hello 4"); } |
| 57 | + _ => { println!("Gbye"); } |
| 58 | + } |
| 59 | +} |
0 commit comments