From af97ba8f295e61f84d147cdc59b3d1d0e6209b4c Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 28 Jul 2017 11:57:31 +0200 Subject: score: Add RTEMS_HAVE_MEMBER_SAME_TYPE() This fixes some "variably modified" warnings and a clang compile error. --- cpukit/score/include/rtems/score/basedefs.h | 19 +++++++++++++++++++ cpukit/score/include/rtems/score/threadqimpl.h | 8 ++++++-- 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 @@ -372,6 +372,25 @@ extern void RTEMS_DEQUALIFY_types_not_compatible(void); #endif /*RTEMS_DEQUALIFY_DEPTHX*/ #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. */ 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 \ ) -- cgit v1.2.3