#define RESTRICT __restrict__
#define MUST_CHECK __attribute__((warn_unused_result))
#define PACKED __attribute__((packed))
+ #define ALIGNED(x) __attribute__ ((__aligned__(x)))
#if CPU_ARM | CPU_CM3
#define NAKED __attribute__((naked))
#else
#ifndef PACKED
#define PACKED /* nothing */
#endif
+#ifndef ALIGNED
+#define ALIGNED /* nothing */
+#endif
#ifndef MEMORY_BARRIER
#define MEMORY_BARRIER /* nothing */
#warning No memory barrier defined for select compiler. If you use the kernel check it.
* NOTE: the construct __builtin_types_compatible_p() is only
* available for C.
*/
- #define countof(a) (sizeof(a) / sizeof(*(a)) + \
- sizeof(typeof(int[1 - 2 * \
- !!__builtin_types_compatible_p(typeof(a), \
- typeof(&a[0]))])) * 0)
+ #define countof(a) (sizeof(a) / sizeof(*(a)) + \
+ STATIC_ASSERT_EXPR( \
+ !__builtin_types_compatible_p( \
+ typeof(a), typeof(&a[0]))))
#else
#define countof(a) (sizeof(a) / sizeof(*(a)))
#endif
#define STATIC_ASSERT(condition) \
UNUSED_VAR(extern char, STATIC_ASSERTION_FAILED__[(condition) ? 1 : -1])
+/**
+ * Issue a compilation error if \a __cond is false (this can be used inside an
+ * expression).
+ */
+#define STATIC_ASSERT_EXPR(__cond) \
+ (sizeof(struct { int STATIC_ASSERTION_FAILED__:!!(__cond); }) * 0)
+
#ifndef ASSERT_TYPE_EQUAL
/** Ensure two variables have the same type. */
#define ASSERT_TYPE_EQUAL(var1, var2) \