Skip to content

Assertions

#define _kassert_pick(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, NAME, ...) \
    NAME
#define _kassert_1(prefix, x) \
    do { \
        if (unlikely(!(x))) { \
            panic(prefix "Assertion \"" #x "\" failed"); \
            __builtin_unreachable(); \
        } \
    } while (0)
#define _kassert_n(prefix, x, fmt, ...) \
    do { \
        if (unlikely(!(x))) { \
            panic(prefix "Assertion \"" #x "\" failed with message: " fmt, \
                  ##__VA_ARGS__); \
            __builtin_unreachable(); \
        } \
    } while (0)
#define _kassert_oops_1(prefix, x) \
    do { \
        if (unlikely(!(x))) { \
            panic(prefix "Oops, assertion \"" #x "\" failed"); \
            __builtin_unreachable(); \
        } \
    } while (0)
#define _kassert_oops_n(prefix, x, fmt, ...) \
    do { \
        if (unlikely(!(x))) { \
            panic(prefix "Oops, assertion \"" #x \
                         "\" failed with message: " fmt, \
                  ##__VA_ARGS__); \
            __builtin_unreachable(); \
        } \
    } while (0)
#define _kassert_debug_1(prefix, x) \
    do { \
        if (unlikely(!(x))) { \
            panic(prefix "Debug assertion \"" #x "\" failed"); \
            __builtin_unreachable(); \
        } \
    } while (0)
#define _kassert_debug_n(prefix, x, fmt, ...) \
    do { \
        if (unlikely(!(x))) { \
            panic(prefix "Debug assertion \"" #x \
                         "\" failed with message: " fmt, \
                  ##__VA_ARGS__); \
            __builtin_unreachable(); \
        } \
    } while (0)
#define _kassert_dispatch(name, prefix, ...) \
    _kassert_pick(__VA_ARGS__, name##_n, name##_n, name##_n, name##_n, \
                  name##_n, name##_n, name##_n, name##_n, name##_n, name##_n, \
                  name##_1)(prefix, __VA_ARGS__)
#define _kassert_fail(prefix, ...) \
    do { \
        panic(prefix __VA_ARGS__); \
        __builtin_unreachable(); \
    } while (0)
#define kassert(...) _kassert_dispatch(_kassert, "", __VA_ARGS__)
#define kassert_unreachable(...) _kassert_fail("unreachable! ", ##__VA_ARGS__)
#define kassert_unimplemented(...) \
    _kassert_fail("unimplemented! ", ##__VA_ARGS__)
#define kassert_todo(...) _kassert_fail("TODO: ", ##__VA_ARGS__)
#define kassert_debug(...) \
    _kassert_dispatch(_kassert_debug, "DEBUG ", __VA_ARGS__)
#define kassert_debug_unreachable(...) \
    _kassert_fail("DEBUG unreachable! ", ##__VA_ARGS__)
#define kassert_debug_unimplemented(...) \
    _kassert_fail("DEBUG unimplemented! ", ##__VA_ARGS__)
#define kassert_debug_todo(...) _kassert_fail("DEBUG TODO: ", ##__VA_ARGS__)
#define kassert_debug(...) ((void) 0)
#define kassert_debug_unreachable(...) ((void) 0)
#define kassert_debug_unimplemented(...) ((void) 0)
#define kassert_debug_todo(...) ((void) 0)