| //@ run-pass | |
| #![allow(dead_code)] | |
| //@ compile-flags: -g | |
| #[derive(PartialEq, Eq)] | |
| struct NewBool(bool); | |
| #[derive(PartialEq, Eq)] | |
| enum Direction { | |
| North, | |
| East, | |
| South, | |
| West | |
| } | |
| #[derive(PartialEq, Eq)] | |
| struct Foo { | |
| bar: Option<Direction>, | |
| baz: NewBool | |
| } | |
| #[derive(PartialEq, Eq)] | |
| enum EnumWithStructVariants { | |
| Variant1(bool), | |
| Variant2 { | |
| dir: Direction | |
| } | |
| } | |
| const TRUE_TRUE: (bool, bool) = (true, true); | |
| const NONE: Option<Direction> = None; | |
| const EAST: Direction = Direction::East; | |
| const NEW_FALSE: NewBool = NewBool(false); | |
| const STATIC_FOO: Foo = Foo { bar: Some(Direction::South), baz: NEW_FALSE }; | |
| const VARIANT2_NORTH: EnumWithStructVariants = EnumWithStructVariants::Variant2 { | |
| dir: Direction::North }; | |
| pub mod glfw { | |
| #[derive(Copy, Clone, PartialEq, Eq)] | |
| pub struct InputState(usize); | |
| pub const RELEASE : InputState = InputState(0); | |
| pub const PRESS : InputState = InputState(1); | |
| pub const REPEAT : InputState = InputState(2); | |
| } | |
| fn issue_6533() { | |
| fn action_to_str(state: glfw::InputState) -> &'static str { | |
| use glfw::{RELEASE, PRESS, REPEAT}; | |
| match state { | |
| RELEASE => { "Released" } | |
| PRESS => { "Pressed" } | |
| REPEAT => { "Repeated" } | |
| _ => { "Unknown" } | |
| } | |
| } | |
| assert_eq!(action_to_str(glfw::RELEASE), "Released"); | |
| assert_eq!(action_to_str(glfw::PRESS), "Pressed"); | |
| assert_eq!(action_to_str(glfw::REPEAT), "Repeated"); | |
| } | |
| fn issue_13626() { | |
| const VAL: [u8; 1] = [0]; | |
| match [1] { | |
| VAL => unreachable!(), | |
| _ => () | |
| } | |
| } | |
| fn issue_14576() { | |
| type Foo = (i32, i32); | |
| const ON: Foo = (1, 1); | |
| const OFF: Foo = (0, 0); | |
| match (1, 1) { | |
| OFF => unreachable!(), | |
| ON => (), | |
| _ => unreachable!() | |
| } | |
| #[derive(PartialEq, Eq)] | |
| enum C { D = 3, E = 4 } | |
| const F : C = C::D; | |
| assert_eq!(match C::D { F => 1, _ => 2, }, 1); | |
| // test gaps | |
| #[derive(PartialEq, Eq)] | |
| enum G { H = 3, I = 5 } | |
| const K : G = G::I; | |
| assert_eq!(match G::I { K => 1, _ => 2, }, 1); | |
| } | |
| fn issue_13731() { | |
| #[derive(PartialEq, Eq)] | |
| enum A { AA(()) } | |
| const B: A = A::AA(()); | |
| match A::AA(()) { | |
| B => () | |
| } | |
| } | |
| fn issue_15393() { | |
| #![allow(dead_code)] | |
| #[derive(PartialEq, Eq)] | |
| struct Flags { | |
| bits: usize | |
| } | |
| const FOO: Flags = Flags { bits: 0x01 }; | |
| const BAR: Flags = Flags { bits: 0x02 }; | |
| match (Flags { bits: 0x02 }) { | |
| FOO => unreachable!(), | |
| BAR => (), | |
| _ => unreachable!() | |
| } | |
| } | |
| fn main() { | |
| assert_eq!(match (true, false) { | |
| TRUE_TRUE => 1, | |
| (false, false) => 2, | |
| (false, true) => 3, | |
| (true, false) => 4 | |
| }, 4); | |
| assert_eq!(match Some(Some(Direction::North)) { | |
| Some(NONE) => 1, | |
| Some(Some(Direction::North)) => 2, | |
| Some(Some(EAST)) => 3, | |
| Some(Some(Direction::South)) => 4, | |
| Some(Some(Direction::West)) => 5, | |
| None => 6 | |
| }, 2); | |
| assert_eq!(match (Foo { bar: Some(Direction::West), baz: NewBool(true) }) { | |
| Foo { bar: None, baz: NewBool(true) } => 1, | |
| Foo { bar: NONE, baz: NEW_FALSE } => 2, | |
| STATIC_FOO => 3, | |
| Foo { bar: _, baz: NEW_FALSE } => 4, | |
| Foo { bar: Some(Direction::West), baz: NewBool(true) } => 5, | |
| Foo { bar: Some(Direction::South), baz: NewBool(true) } => 6, | |
| Foo { bar: Some(EAST), .. } => 7, | |
| Foo { bar: Some(Direction::North), baz: NewBool(true) } => 8 | |
| }, 5); | |
| assert_eq!(match (EnumWithStructVariants::Variant2 { dir: Direction::North }) { | |
| EnumWithStructVariants::Variant1(true) => 1, | |
| EnumWithStructVariants::Variant1(false) => 2, | |
| EnumWithStructVariants::Variant2 { dir: Direction::West } => 3, | |
| VARIANT2_NORTH => 4, | |
| EnumWithStructVariants::Variant2 { dir: Direction::South } => 5, | |
| EnumWithStructVariants::Variant2 { dir: Direction::East } => 6 | |
| }, 4); | |
| issue_6533(); | |
| issue_13626(); | |
| issue_13731(); | |
| issue_14576(); | |
| issue_15393(); | |
| } |