#![feature(prelude_import)]
#![no_std]
// check-pass
// compile-flags: -Z unpretty=expanded

#![feature(core_intrinsics, generic_assert, generic_assert_internals)]
#[prelude_import]
use ::std::prelude::rust_2015::*;
#[macro_use]
extern crate std;

fn arbitrary_consuming_method_for_demonstration_purposes() {
    let elem = 1i32;
    {
        #[allow(unused_imports)]
        use ::core::asserting::{TryCaptureGeneric, TryCapturePrintable};
        let mut __capture0 = ::core::asserting::Capture::new();
        let __local_bind0 = &elem;
        if ::core::intrinsics::unlikely(!(*{
                                    (&::core::asserting::Wrapper(__local_bind0)).try_capture(&mut __capture0);
                                    __local_bind0
                                } as usize)) {




                {
                    ::std::rt::panic_fmt(::core::fmt::Arguments::new_v1(&["Assertion failed: elem as usize\nWith captures:\n  elem = ",
                                        "\n"], &[::core::fmt::ArgumentV1::new_debug(&__capture0)]))
                }
            }
    };
}
fn addr_of() {
    let elem = 1i32;
    {
        #[allow(unused_imports)]
        use ::core::asserting::{TryCaptureGeneric, TryCapturePrintable};
        let mut __capture0 = ::core::asserting::Capture::new();
        let __local_bind0 = &elem;
        if ::core::intrinsics::unlikely(!&*__local_bind0) {
                (&::core::asserting::Wrapper(__local_bind0)).try_capture(&mut __capture0);
                {
                    ::std::rt::panic_fmt(::core::fmt::Arguments::new_v1(&["Assertion failed: &elem\nWith captures:\n  elem = ",
                                        "\n"], &[::core::fmt::ArgumentV1::new_debug(&__capture0)]))
                }
            }
    };
}
fn binary() {
    let elem = 1i32;
    {
        #[allow(unused_imports)]
        use ::core::asserting::{TryCaptureGeneric, TryCapturePrintable};
        let mut __capture0 = ::core::asserting::Capture::new();
        let __local_bind0 = &elem;
        if ::core::intrinsics::unlikely(!(*__local_bind0 == 1)) {
                (&::core::asserting::Wrapper(__local_bind0)).try_capture(&mut __capture0);
                {
                    ::std::rt::panic_fmt(::core::fmt::Arguments::new_v1(&["Assertion failed: elem == 1\nWith captures:\n  elem = ",
                                        "\n"], &[::core::fmt::ArgumentV1::new_debug(&__capture0)]))
                }
            }
    };
    {
        #[allow(unused_imports)]
        use ::core::asserting::{TryCaptureGeneric, TryCapturePrintable};
        let mut __capture0 = ::core::asserting::Capture::new();
        let __local_bind0 = &elem;
        if ::core::intrinsics::unlikely(!(*__local_bind0 >= 1)) {
                (&::core::asserting::Wrapper(__local_bind0)).try_capture(&mut __capture0);
                {
                    ::std::rt::panic_fmt(::core::fmt::Arguments::new_v1(&["Assertion failed: elem >= 1\nWith captures:\n  elem = ",
                                        "\n"], &[::core::fmt::ArgumentV1::new_debug(&__capture0)]))
                }
            }
    };
    {
        #[allow(unused_imports)]
        use ::core::asserting::{TryCaptureGeneric, TryCapturePrintable};
        let mut __capture0 = ::core::asserting::Capture::new();
        let __local_bind0 = &elem;
        if ::core::intrinsics::unlikely(!(*__local_bind0 > 0)) {
                (&::core::asserting::Wrapper(__local_bind0)).try_capture(&mut __capture0);
                {
                    ::std::rt::panic_fmt(::core::fmt::Arguments::new_v1(&["Assertion failed: elem > 0\nWith captures:\n  elem = ",
                                        "\n"], &[::core::fmt::ArgumentV1::new_debug(&__capture0)]))
                }
            }
    };
    {
        #[allow(unused_imports)]
        use ::core::asserting::{TryCaptureGeneric, TryCapturePrintable};
        let mut __capture0 = ::core::asserting::Capture::new();
        let __local_bind0 = &elem;
        if ::core::intrinsics::unlikely(!(*__local_bind0 < 3)) {
                (&::core::asserting::Wrapper(__local_bind0)).try_capture(&mut __capture0);
                {
                    ::std::rt::panic_fmt(::core::fmt::Arguments::new_v1(&["Assertion failed: elem < 3\nWith captures:\n  elem = ",
                                        "\n"], &[::core::fmt::ArgumentV1::new_debug(&__capture0)]))
                }
            }
    };
    {
        #[allow(unused_imports)]
        use ::core::asserting::{TryCaptureGeneric, TryCapturePrintable};
        let mut __capture0 = ::core::asserting::Capture::new();
        let __local_bind0 = &elem;
        if ::core::intrinsics::unlikely(!(*__local_bind0 <= 3)) {
                (&::core::asserting::Wrapper(__local_bind0)).try_capture(&mut __capture0);
                {
                    ::std::rt::panic_fmt(::core::fmt::Arguments::new_v1(&["Assertion failed: elem <= 3\nWith captures:\n  elem = ",
                                        "\n"], &[::core::fmt::ArgumentV1::new_debug(&__capture0)]))
                }
            }
    };
    {
        #[allow(unused_imports)]
        use ::core::asserting::{TryCaptureGeneric, TryCapturePrintable};
        let mut __capture0 = ::core::asserting::Capture::new();
        let __local_bind0 = &elem;
        if ::core::intrinsics::unlikely(!(*__local_bind0 != 3)) {
                (&::core::asserting::Wrapper(__local_bind0)).try_capture(&mut __capture0);
                {
                    ::std::rt::panic_fmt(::core::fmt::Arguments::new_v1(&["Assertion failed: elem != 3\nWith captures:\n  elem = ",
                                        "\n"], &[::core::fmt::ArgumentV1::new_debug(&__capture0)]))
                }
            }
    };
}
fn unary() {
    let elem = &1i32;
    {
        #[allow(unused_imports)]
        use ::core::asserting::{TryCaptureGeneric, TryCapturePrintable};
        let mut __capture0 = ::core::asserting::Capture::new();
        let __local_bind0 = &elem;
        if ::core::intrinsics::unlikely(!**__local_bind0) {
                (&::core::asserting::Wrapper(__local_bind0)).try_capture(&mut __capture0);
                {
                    ::std::rt::panic_fmt(::core::fmt::Arguments::new_v1(&["Assertion failed: *elem\nWith captures:\n  elem = ",
                                        "\n"], &[::core::fmt::ArgumentV1::new_debug(&__capture0)]))
                }
            }
    };
}
fn main() {}
