template <typename T>
struct can_malloc
{
+ /*
+ * gcc versions before 5.0 lack some type traits defined in C++11.
+ * Since in this instance we use the trait to prevent misuses
+ * of malloc (and statically assert) and not to generate different
+ * code based on this property, simply set value to true and allow
+ * the code to compile. Anyone using a contemporary compiler will
+ * catch the error.
+ */
+#if __GNUG__ && __GNUC__ < 5
+ static constexpr bool value = true;
+#else
static constexpr bool value = std::is_trivially_constructible<T>::value;
+#endif
};
/*
template<typename T>
struct can_free
{
+ /*
+ * gcc versions before 5.0 lack some type traits defined in C++11.
+ * Since in this instance we use the trait to prevent misuses
+ * of free (and statically assert) and not to generate different
+ * code based on this property, simply set value to true and allow
+ * the code to compile. Anyone using a contemporary compiler will
+ * catch the error.
+ */
+#if __GNUG__ && __GNUC__ < 5
+ static constexpr bool value = true;
+#else
static constexpr bool value = std::is_trivially_destructible<T>::value || std::is_void<T>::value;
+#endif
};
template<typename T, typename = typename std::enable_if<!can_free<T>::value>::type>
template<typename T>
struct can_memcpy
{
+ /*
+ * gcc versions before 5.0 lack some type traits defined in C++11.
+ * Since in this instance we use the trait to prevent misuses
+ * of memcpy (and statically assert) and not to generate different
+ * code based on this property, simply set value to true and allow
+ * the code to compile. Anyone using a contemporary compiler will
+ * catch the error.
+ */
+#if __GNUG__ && __GNUC__ < 5
+ static constexpr bool value = true;
+#else
static constexpr bool value = std::is_trivially_copyable<T>::value;
+#endif
};
template <typename T, typename U,
template<typename T>
struct can_memmove
{
+ /*
+ * gcc versions before 5.0 lack some type traits defined in C++11.
+ * Since in this instance we use the trait to prevent misuses
+ * of memmove (and statically assert) and not to generate different
+ * code based on this property, simply set value to true and allow
+ * the code to compile. Anyone using a contemporary compiler will
+ * catch the error.
+ */
+#if __GNUG__ && __GNUC__ < 5
+ static constexpr bool value = true;
+#else
static constexpr bool value = std::is_trivially_copyable<T>::value;
+#endif
};
template <typename T, typename U,
# define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \
_Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"")
# define DIAGNOSTIC_IGNORE_LOGICAL_OP
+# define DIAGNOSTIC_IGNORE_DUPLICATED_BRANCHES
+# define DIAGNOSTIC_IGNORE_INVALID_OFFSETOF
+ _Pragma("GCC diagnostic ignored \"-Winvalid-offsetof\"")
#else
/* GCC */
# define DIAGNOSTIC_IGNORE_SUGGEST_ATTRIBUTE_FORMAT \
_Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"")
# define DIAGNOSTIC_IGNORE_LOGICAL_OP \
_Pragma("GCC diagnostic ignored \"-Wlogical-op\"")
+# define DIAGNOSTIC_IGNORE_DUPLICATED_BRANCHES \
+ _Pragma("GCC diagnostic ignored \"-Wduplicated-branches\"")
+# define DIAGNOSTIC_IGNORE_INVALID_OFFSETOF \
+ _Pragma("GCC diagnostic ignored \"-Winvalid-offsetof\"")
#endif
/* Used to make specific C++ functions to C code. */