configure: disable compile time asserts for !opt and !static_assert
[fio.git] / compiler / compiler.h
index 0a0213b60fca5204cb9d0294ffb01139baa23083..20df21d050c3ba7941e705bf51140430dd7b237a 100644 (file)
@@ -1,5 +1,6 @@
 #ifndef FIO_COMPILER_H
 #define FIO_COMPILER_H
 #ifndef FIO_COMPILER_H
 #define FIO_COMPILER_H
+#include <assert.h>
 
 #if __GNUC__ >= 4
 #include "compiler-gcc4.h"
 
 #if __GNUC__ >= 4
 #include "compiler-gcc4.h"
 
 #define fio_unlikely(x)        __builtin_expect(!!(x), 0)
 
 
 #define fio_unlikely(x)        __builtin_expect(!!(x), 0)
 
+/*
+ * Check at compile time that something is of a particular type.
+ * Always evaluates to 1 so you may use it easily in comparisons.
+ */
+#define typecheck(type,x) \
+({     type __dummy; \
+       typeof(x) __dummy2; \
+       (void)(&__dummy == &__dummy2); \
+       1; \
+})
+
+
+#if defined(CONFIG_STATIC_ASSERT)
+#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
+
+#elif !defined(CONFIG_DISABLE_OPTIMIZATIONS)
+
+#ifndef __compiletime_error
+#define __compiletime_error(message)
+#endif
+
+#ifndef __compiletime_error_fallback
+#define __compiletime_error_fallback(condition)        do { } while (0)
+#endif
+
+#define __compiletime_assert(condition, msg, prefix, suffix)           \
+       do {                                                            \
+               int __cond = !(condition);                              \
+               extern void prefix ## suffix(void) __compiletime_error(msg); \
+               if (__cond)                                             \
+                       prefix ## suffix();                             \
+               __compiletime_error_fallback(__cond);                   \
+       } while (0)
+
+#define _compiletime_assert(condition, msg, prefix, suffix) \
+       __compiletime_assert(condition, msg, prefix, suffix)
+
+#define compiletime_assert(condition, msg) \
+       _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
+
+#else
+
+#define compiletime_assert(condition, msg)     do { } while (0)
+
+#endif
+
 #endif
 #endif