#ifdef _ASSERT_H #undef _ASSERT_H #undef assert #ifdef COSMO #undef unassert #undef npassert #ifndef NDEBUG #undef __assert_macro #endif /* NDEBUG */ #endif /* COSMO */ #endif /* _ASSERT_H */ #ifndef _ASSERT_H #define _ASSERT_H COSMOPOLITAN_C_START_ void __assert_fail(const char *, const char *, int) relegated; #ifdef NDEBUG #define assert(x) ((void)0) #else #define assert(x) ((void)((x) || (__assert_fail(#x, __FILE__, __LINE__), 0))) #endif #if __STDC_VERSION__ >= 201112L && !defined(__cplusplus) #undef static_assert #define static_assert _Static_assert #endif #ifdef COSMO extern bool __assert_disable; #ifndef NDEBUG #define unassert(x) __assert_macro(x, #x) #define npassert(x) __assert_macro(x, #x) #define __assert_macro(x, s) \ ({ \ if (__builtin_expect(!(x), 0)) { \ __assert_fail(s, __FILE__, __LINE__); \ __builtin_trap(); \ } \ (void)0; \ }) #else #define npassert(x) \ ({ \ if (__builtin_expect(!(x), 0)) { \ __builtin_trap(); \ } \ (void)0; \ }) #define unassert(x) \ ({ \ if (__builtin_expect(!(x), 0)) { \ __builtin_unreachable(); \ } \ (void)0; \ }) #endif /* NDEBUG */ #endif /* COSMO */ COSMOPOLITAN_C_END_ #endif /* _ASSERT_H */