vppinfra: enable STATIC_ASSERT with clang 90/28490/2
authorBenoît Ganne <bganne@cisco.com>
Tue, 7 Jul 2020 14:32:22 +0000 (16:32 +0200)
committerAndrew Yourtchenko <ayourtch@gmail.com>
Tue, 18 Aug 2020 19:47:21 +0000 (19:47 +0000)
For some reason clang does not support &((struct foo*)0)->field in
static assertion contrary to gcc.
Use offsetof() macro implementation provided by both compilers instead.

Type: fix

Change-Id: I3311cdd29c5861e45dc0ef92f2bbd66242ca73b8
Signed-off-by: Benoît Ganne <bganne@cisco.com>
(cherry picked from commit 5e60c17f49082b7731778e81b58177177a31b58f)

src/vppinfra/clib.h
src/vppinfra/error_bootstrap.h

index 5e62cc8..ecd7098 100644 (file)
@@ -38,6 +38,7 @@
 #ifndef included_clib_h
 #define included_clib_h
 
+#include <stddef.h>
 #include <vppinfra/config.h>
 
 /* Standalone means to not assume we are running on a Unix box. */
@@ -62,8 +63,8 @@
 #define ARRAY_LEN(x)   (sizeof (x)/sizeof (x[0]))
 
 #define _STRUCT_FIELD(t,f) (((t *) 0)->f)
-#define STRUCT_OFFSET_OF(t,f) ((uword) & _STRUCT_FIELD (t, f))
-#define STRUCT_BIT_OFFSET_OF(t,f) (BITS(u8) * (uword) & _STRUCT_FIELD (t, f))
+#define STRUCT_OFFSET_OF(t,f) offsetof(t, f)
+#define STRUCT_BIT_OFFSET_OF(t,f) (BITS(u8) * STRUCT_OFFSET_OF (t, f))
 #define STRUCT_SIZE_OF(t,f)   (sizeof (_STRUCT_FIELD (t, f)))
 #define STRUCT_BITS_OF(t,f)   (BITS (_STRUCT_FIELD (t, f)))
 #define STRUCT_ARRAY_LEN(t,f) ARRAY_LEN (_STRUCT_FIELD (t, f))
index 8dbbc7f..185f4c6 100644 (file)
@@ -108,11 +108,7 @@ do {                                            \
 } while (0)
 #endif /* __COVERITY */
 
-#if defined(__clang__)
-#define STATIC_ASSERT(truth,...)
-#else
 #define STATIC_ASSERT(truth,...) _Static_assert(truth, __VA_ARGS__)
-#endif
 
 #define STATIC_ASSERT_SIZEOF(d, s) \
   STATIC_ASSERT (sizeof (d) == s, "Size of " #d " must be " # s " bytes")