[src]

std::macros::fail

macro_rules! fail(
    () => (
        fail!("explicit failure")
    );
    ($msg:expr) => (
        ::std::rt::begin_unwind($msg, file!(), line!())
    );
    ($fmt:expr, $($arg:tt)*) => ({
        // a closure can't have return type !, so we need a full
        // function to pass to format_args!, *and* we need the
        // file and line numbers right here; so an inner bare fn
        // is our only choice.
        //
        // LLVM doesn't tend to inline this, presumably because begin_unwind_fmt
        // is #[cold] and #[inline(never)] and because this is flagged as cold
        // as returning !. We really do want this to be inlined, however,
        // because it's just a tiny wrapper. Small wins (156K to 149K in size)
        // were seen when forcing this to be inlined, and that number just goes
        // up with the number of calls to fail!()
        #[inline(always)]
        fn run_fmt(fmt: &::std::fmt::Arguments) -> ! {
            ::std::rt::begin_unwind_fmt(fmt, file!(), line!())
        }
        format_args!(run_fmt, $fmt, $($arg)*)
    });
)

The entry point for failure of rust tasks.

This macro is used to inject failure into a rust task, causing the task to unwind and fail entirely. Each task's failure can be reaped as the ~Any type, and the single-argument form of the fail! macro will be the value which is transmitted.

The multi-argument form of this macro fails with a string and has the format! sytnax for building a string.

Example

fail!();
fail!("this is a terrible mistake!");
fail!(4); // fail with the value of 4 to be collected elsewhere
fail!("this is a {} {message}", "fancy", message = "message");