// min-lldb-version: 310

// compile-flags:-g

#![allow(dead_code, unused_variables)]
#![feature(omit_gdb_pretty_printer_section)]
#![omit_gdb_pretty_printer_section]

// This test makes sure that the compiler doesn't crash when trying to assign
// debug locations to 'constant' patterns in match expressions.

const CONSTANT: u64 = 3;

#[derive(PartialEq, Eq)]
struct Struct {
    a: isize,
    b: usize,
}
const STRUCT: Struct = Struct { a: 1, b: 2 };

#[derive(PartialEq, Eq)]
struct TupleStruct(u32);
const TUPLE_STRUCT: TupleStruct = TupleStruct(4);

#[derive(PartialEq, Eq)]
enum Enum {
    Variant1(char),
    Variant2 { a: u8 },
    Variant3
}
const VARIANT1: Enum = Enum::Variant1('v');
const VARIANT2: Enum = Enum::Variant2 { a: 2 };
const VARIANT3: Enum = Enum::Variant3;

const STRING: &'static str = "String";

fn main() {

    match 1 {
        CONSTANT => {}
        _ => {}
    };

    // if let 3 = CONSTANT {}

    match (Struct { a: 2, b: 2 }) {
        STRUCT => {}
        _ => {}
    };

    // if let STRUCT = STRUCT {}

    match TupleStruct(3) {
        TUPLE_STRUCT => {}
        _ => {}
    };

    // if let TupleStruct(4) = TUPLE_STRUCT {}

    match VARIANT3 {
        VARIANT1 => {},
        VARIANT2 => {},
        VARIANT3 => {},
        _ => {}
    };

    match (VARIANT3, VARIANT2) {
        (VARIANT1, VARIANT3) => {},
        (VARIANT2, VARIANT2) => {},
        (VARIANT3, VARIANT1) => {},
        _ => {}
    };

    // if let VARIANT1 = Enum::Variant3 {}
    // if let VARIANT2 = Enum::Variant3 {}
    // if let VARIANT3 = Enum::Variant3 {}

    match "abc" {
        STRING => {},
        _ => {}
    }

    if let STRING = "def" {}
}
