// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![deny(non_snake_case)]
#![feature(stmt_expr_attributes)]

fn main() {
    let a = 413;
    #[cfg(unset)]
    let a = ();
    assert_eq!(a, 413);

    let mut b = 612;
    #[cfg(unset)]
    {
        b = 1111;
    }
    assert_eq!(b, 612);

    #[cfg(unset)]
    undefined_fn();

    #[cfg(unset)]
    undefined_macro!();
    #[cfg(unset)]
    undefined_macro![];
    #[cfg(unset)]
    undefined_macro!{};

    // pretty printer bug...
    // #[cfg(unset)]
    // undefined_macro!{}

    let () = (#[cfg(unset)] 341,); // Should this also work on parens?
    let t = (1, #[cfg(unset)] 3, 4);
    assert_eq!(t, (1, 4));

    let f = |_: u32, _: u32| ();
    f(2, 1, #[cfg(unset)] 6);

    let _: u32 = a.clone(#[cfg(unset)] undefined);

    let _: [(); 0] = [#[cfg(unset)] 126];
    let t = [#[cfg(unset)] 1, 2, 6];
    assert_eq!(t, [2, 6]);

    {
        let r;
        #[cfg(unset)]
        (r = 5);
        #[cfg(not(unset))]
        (r = 10);
        assert_eq!(r, 10);
    }

    // check that macro expanded code works

    macro_rules! if_cfg {
        ($cfg:meta $ib:block else $eb:block) => {
            {
                let r;
                #[cfg($cfg)]
                (r = $ib);
                #[cfg(not($cfg))]
                (r = $eb);
                r
            }
        }
    }

    let n = if_cfg!(unset {
        413
    } else {
        612
    });

    assert_eq!((#[cfg(unset)] 1, #[cfg(not(unset))] 2), (2,));
    assert_eq!(n, 612);

    // check that lints work

    #[allow(non_snake_case)]
    let FOOBAR = {
        fn SYLADEX() {}
    };

    #[allow(non_snake_case)]
    {
        fn CRUXTRUDER() {}
    }
}
