Revert "compiler.h: Introduce caa_unqual_scalar_typeof"
[userspace-rcu.git] / include / urcu / compiler.h
index 511dbdf302456d46329bce98e1147b7c34a51543..0de713adc1a03f4affc48eda0efd03c1b7c1a470 100644 (file)
 
 #include <stddef.h>    /* for offsetof */
 
+#if defined __cplusplus
+# include <type_traits>        /* for std::remove_cv */
+#endif
+
 #define caa_likely(x)  __builtin_expect(!!(x), 1)
 #define caa_unlikely(x)        __builtin_expect(!!(x), 0)
 
                (type *)((char *)__ptr - offsetof(type, member));       \
        })
 
+/*
+ * caa_container_of_check_null - Get the address of an object containing a field.
+ *
+ * @ptr: pointer to the field.
+ * @type: type of the object.
+ * @member: name of the field within the object.
+ *
+ * Return the address of the object containing the field. Return NULL if
+ * @ptr is NULL.
+ */
+#define caa_container_of_check_null(ptr, type, member)                 \
+       __extension__                                                   \
+       ({                                                              \
+               const __typeof__(((type *) NULL)->member) * __ptr = (ptr); \
+               (__ptr) ? (type *)((char *)__ptr - offsetof(type, member)) : NULL; \
+       })
+
 #define CAA_BUILD_BUG_ON_ZERO(cond) (sizeof(struct { int:-!!(cond); }))
 #define CAA_BUILD_BUG_ON(cond) ((void)CAA_BUILD_BUG_ON_ZERO(cond))
 
 #define __rcu
 
 #ifdef __cplusplus
-#define URCU_FORCE_CAST(type, arg)     (reinterpret_cast<type>(arg))
+#define URCU_FORCE_CAST(_type, arg)    (reinterpret_cast<std::remove_cv<_type>::type>(arg))
 #else
 #define URCU_FORCE_CAST(type, arg)     ((type) (arg))
 #endif
 #define CAA_ARRAY_SIZE(x)      (sizeof(x) / sizeof((x)[0]))
 
 /*
- * Don't allow compiling with buggy compiler.
+ * URCU_GCC_VERSION is used to blacklist specific GCC versions with known
+ * bugs, clang also defines these macros to an equivalent GCC version it
+ * claims to support, so exclude it.
  */
-
-#ifdef __GNUC__
+#if defined(__GNUC__) && !defined(__clang__)
 # 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.023432 seconds and 4 git commands to generate.