#define GLUE(x, y) MLIB__GLUE(x, y)
#ifdef static_assert
-# define STATIC_ASSERT(cond, msg) static_assert(cond, msg)
+# define STATIC_ASSERT(cond, msg) static_assert(!!(cond), msg)
#else
# define STATIC_ASSERT(cond, msg) \
IGNORABLE extern char static_assert_failed[2*!!(cond) - 1]
#endif
+#define COMMA ,
+
/*----- String and character hacks ----------------------------------------*/
#define CTYPE_HACK(func, ch) (func((unsigned char)(ch)))
# define IGNORABLE __attribute__((__unused__))
#endif
+#if GCC_VERSION_P(3, 4) || CLANG_VERSION_P(3, 3)
+# define MUST_CHECK __attribute__((__warn_unused_result__))
+#endif
+
#if GCC_VERSION_P(4, 5) || CLANG_VERSION_P(3, 3)
# define DEPRECATED(msg) __attribute__((__deprecated__(msg)))
#elif GCC_VERSION_P(3, 1)
# define EXECL_LIKE(ntrail) __attribute__((__sentinel__(ntrail)))
#endif
+#if GCC_VERSION_P(2, 7) || CLANG_VERSION_P(0, 0)
+# define LAUNDER(x) \
+ ({ __typeof__(x) _y; __asm__("" : "=g"(_y) : "0"(x)); _y; })
+# define RELAX do __asm__ __volatile__("" ::: "memory"); while (0)
+#endif
+
#if CLANG_VERSION_P(3, 3)
# define MLIB__PRAGMA_HACK(x) _Pragma(#x)
# define MUFFLE_WARNINGS_STMT(warns, body) \
do { MLIB__MUFFLE_WARNINGS(warns, body) } while (0)
-#elif GCC_VERSION_P(4, 6)
+#endif
+
+#if GCC_VERSION_P(4, 6)
/* --- Diagnostic suppression in GCC: a tale of woe --- *
*
# define IGNORABLE
#endif
+#ifndef MUST_CHECK
+# define MUST_CHECK
+#endif
+
+#ifndef LAUNDER
+# define LAUNDER
+#endif
+
+#ifndef RELAX
+# define RELAX
+#endif
+
#ifndef GCC_WARNING
# define GCC_WARNING(warn)
#endif