Mark braced-groups within expressions with __extension__
[userspace-rcu.git] / urcu / compiler.h
index cd4a49d19dc6e82f454027bfba76dc2f8eb14bf5..378f0eae8a59b3d0c1029566a174b0b6011e3009 100644 (file)
@@ -64,6 +64,7 @@
  * @member: name of the field within the object.
  */
 #define caa_container_of(ptr, type, member)                            \
+       __extension__                                                   \
        ({                                                              \
                const __typeof__(((type *) NULL)->member) * __ptr = (ptr); \
                (type *)((char *)__ptr - offsetof(type, member));       \
 #define URCU_FORCE_CAST(type, arg)     ((type) (arg))
 #endif
 
-#define caa_is_signed_type(type)       (((type) (-1)) < 0)
+#define caa_is_signed_type(type)       ((type) -1 < (type) 0)
 
-#define caa_cast_long_keep_sign(v)     \
-       (caa_is_signed_type(__typeof__(v)) ? (long) (v) : (unsigned long) (v))
+/*
+ * Cast to unsigned long, sign-extending if @v is signed.
+ * Note: casting to a larger type or to same type size keeps the sign of
+ * the expression being cast (see C99 6.3.1.3).
+ */
+#define caa_cast_long_keep_sign(v)     ((unsigned long) (v))
+
+/*
+ * Don't allow compiling with buggy compiler.
+ */
+
+#ifdef __GNUC__
+# define URCU_GCC_VERSION      (__GNUC__ * 10000 \
+                               + __GNUC_MINOR__ * 100 \
+                               + __GNUC_PATCHLEVEL__)
+
+/*
+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58854
+ */
+# ifdef __ARMEL__
+#  if URCU_GCC_VERSION >= 40800 && URCU_GCC_VERSION <= 40802
+#   error Your gcc version produces clobbered frame accesses
+#  endif
+# endif
+#endif
 
 #endif /* _URCU_COMPILER_H */
This page took 0.024125 seconds and 4 git commands to generate.