On 11/05/17 16:26, Daniel Hellstrom wrote:
From: Jacob Hansen <jacob.han...@gaisler.com>

---
  cpukit/score/include/rtems/score/threadqimpl.h | 4 +---
  1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/cpukit/score/include/rtems/score/threadqimpl.h 
b/cpukit/score/include/rtems/score/threadqimpl.h
index 574221c..975221c 100644
--- a/cpukit/score/include/rtems/score/threadqimpl.h
+++ b/cpukit/score/include/rtems/score/threadqimpl.h
@@ -1140,9 +1140,7 @@ typedef struct {
  #define THREAD_QUEUE_OBJECT_ASSERT( object_type, wait_queue_member ) \
    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 ) ), \
+      == offsetof( Thread_queue_Object, Wait_queue ), \
      object_type \
    )

This assertion checks two things.

1. That the member offset of both structures is equal.

2. That the type of the members is identical.

You remove (2). A quick test of

struct s {
    int i;
};

_Static_assert(__builtin_types_compatible_p(__typeof(((struct s *)0)->i), int), "s");

struct t {
    int i;
};

_Static_assert(&(((struct s *)4096)->i) == &(((struct t *)4096)->i), "t");

struct u {
    int i;
};

_Static_assert(&(((struct s *)0)->i) == &(((struct u *)0)->i), "u");

with clang results in

clang -S test.c -o -
test.c:11:16: error: static_assert expression is not an integral constant expression
_Static_assert(&(((struct s *)4096)->i) == &(((struct t *)4096)->i), "t");
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.c:11:19: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
_Static_assert(&(((struct s *)4096)->i) == &(((struct t *)4096)->i), "t");
                  ^
test.c:17:16: error: static_assert expression is not an integral constant expression
_Static_assert(&(((struct s *)0)->i) == &(((struct u *)0)->i), "u");
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.c:17:35: note: cannot access field of null pointer
_Static_assert(&(((struct s *)0)->i) == &(((struct u *)0)->i), "u");
                                  ^
2 errors generated.

with gcc results in

gcc -S -o - test.c -std=c11
        .file   "test.c"
.ident "GCC: (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]"
        .section        .note.GNU-stack,"",@progbits

So, maybe use |__builtin_types_compatible_p() and typeof (should be done via <rtems/score/basedefs.h>). Maybe ask on the LLVM mailing list on how to check structure member types.

|

--
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.hu...@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to