summaryrefslogtreecommitdiffstats
path: root/cpukit/score
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-07-28 11:57:31 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-07-31 09:48:11 +0200
commitaf97ba8f295e61f84d147cdc59b3d1d0e6209b4c (patch)
treef54b6416e5633c41f389b2e390b867bda5f9e2fa /cpukit/score
parentpsximfs02/init.c: Increase size of buffer to avoid overwrite (diff)
downloadrtems-af97ba8f295e61f84d147cdc59b3d1d0e6209b4c.tar.bz2
score: Add RTEMS_HAVE_MEMBER_SAME_TYPE()
This fixes some "variably modified" warnings and a clang compile error.
Diffstat (limited to 'cpukit/score')
-rw-r--r--cpukit/score/include/rtems/score/basedefs.h19
-rw-r--r--cpukit/score/include/rtems/score/threadqimpl.h8
2 files changed, 25 insertions, 2 deletions
diff --git a/cpukit/score/include/rtems/score/basedefs.h b/cpukit/score/include/rtems/score/basedefs.h
index 288afd41aa..4994579e48 100644
--- a/cpukit/score/include/rtems/score/basedefs.h
+++ b/cpukit/score/include/rtems/score/basedefs.h
@@ -373,6 +373,25 @@ extern void RTEMS_DEQUALIFY_types_not_compatible(void);
#endif /*RTEMS_DEQUALIFY*/
/**
+ * @brief Evaluates to true if the members of two types have the same type.
+ *
+ * @param[in] _t_lhs Left hand side type.
+ * @param[in] _m_lhs Left hand side member.
+ * @param[in] _t_rhs Right hand side type.
+ * @param[in] _m_rhs Right hand side member.
+ */
+#ifdef __GNUC__
+ #define RTEMS_HAVE_MEMBER_SAME_TYPE( _t_lhs, _m_lhs, _t_rhs, _m_rhs ) \
+ __builtin_types_compatible_p( \
+ __typeof( ( (_t_lhs *) 0 )->_m_lhs ), \
+ __typeof( ( (_t_rhs *) 0 )->_m_rhs ) \
+ )
+#else
+ #define RTEMS_HAVE_MEMBER_SAME_TYPE( _t_lhs, _m_lhs, _t_rhs, _m_rhs ) \
+ true
+#endif
+
+/**
* @brief Concatenates _x and _y without expanding.
*/
#define RTEMS_CONCAT( _x, _y ) _x##_y
diff --git a/cpukit/score/include/rtems/score/threadqimpl.h b/cpukit/score/include/rtems/score/threadqimpl.h
index 574221ca9c..c4a22a5def 100644
--- a/cpukit/score/include/rtems/score/threadqimpl.h
+++ b/cpukit/score/include/rtems/score/threadqimpl.h
@@ -1141,8 +1141,12 @@ typedef struct {
RTEMS_STATIC_ASSERT( \
offsetof( object_type, wait_queue_member ) \
== offsetof( Thread_queue_Object, Wait_queue ) \
- && ( &( ( (object_type *) 0 )->wait_queue_member ) \
- == ( &( (Thread_queue_Object *) 0 )->Wait_queue ) ), \
+ && RTEMS_HAVE_MEMBER_SAME_TYPE( \
+ object_type, \
+ wait_queue_member, \
+ Thread_queue_Object, \
+ Wait_queue \
+ ), \
object_type \
)