// Can't use unit struct as tuple struct pattern

// aux-build:empty-struct.rs

extern crate empty_struct;
use empty_struct::*;

struct Empty2;

enum E {
    Empty4
}

fn main() {
    let e2 = Empty2;
    let e4 = E::Empty4;
    let xe2 = XEmpty2;
    let xe4 = XE::XEmpty4;

    match e2 {
        Empty2() => () //~ ERROR expected tuple struct or tuple variant, found unit struct `Empty2`
    }
    match xe2 {
        XEmpty2() => ()
        //~^ ERROR expected tuple struct or tuple variant, found unit struct `XEmpty2`
    }
    match e2 {
        Empty2(..) => ()
        //~^ ERROR expected tuple struct or tuple variant, found unit struct `Empty2`
    }
    match xe2 {
        XEmpty2(..) => ()
        //~^ ERROR expected tuple struct or tuple variant, found unit struct `XEmpty2`
    }

    match e4 {
        E::Empty4() => ()
        //~^ ERROR expected tuple struct or tuple variant, found unit variant `E::Empty4`
    }
    match xe4 {
        XE::XEmpty4() => (),
        //~^ ERROR expected tuple struct or tuple variant, found unit variant `XE::XEmpty4`
        _ => {},
    }
    match e4 {
        E::Empty4(..) => ()
        //~^ ERROR expected tuple struct or tuple variant, found unit variant `E::Empty4`
    }
    match xe4 {
        XE::XEmpty4(..) => (),
        //~^ ERROR expected tuple struct or tuple variant, found unit variant `XE::XEmpty4`
        _ => {},
    }
}
