mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2025-12-26 16:50:09 +01:00
internals: Use Standard C offsetof macro if available
clang 13 fails to compile our current implementation with:
.../dbus/dbus-message.c:2070:3: error: variable length array folded to constant array as an extension [-Werror,-Wgnu-folding-constant]
_DBUS_STATIC_ASSERT (_DBUS_ALIGNOF (DBusMessageRealIter) <=
^
.../dbus/dbus-internals.h:460:25: note: expanded from macro '_DBUS_STATIC_ASSERT'
typedef struct { char _assertion[(expr) ? 1 : -1]; } \
This appears to be because the "traditional" definition of
offsetof(), which we're hard-coding here, does not qualify as a constant
expression under C rules due to its use of pointer casts.
Modern compilers like gcc and clang have a built-in implementation
of offsetof that *is* a constant expression.
Signed-off-by: Simon McVittie <smcv@collabora.com>
This commit is contained in:
parent
83232393ef
commit
a24cf746e2
1 changed files with 5 additions and 0 deletions
|
|
@ -193,8 +193,13 @@ void _dbus_real_assert_not_reached (const char *explanation,
|
|||
|
||||
#define _DBUS_ZERO(object) (memset (&(object), '\0', sizeof ((object))))
|
||||
|
||||
#ifdef offsetof
|
||||
#define _DBUS_STRUCT_OFFSET(struct_type, member) \
|
||||
(offsetof (struct_type, member))
|
||||
#else
|
||||
#define _DBUS_STRUCT_OFFSET(struct_type, member) \
|
||||
((intptr_t) ((unsigned char*) &((struct_type*) 0)->member))
|
||||
#endif
|
||||
|
||||
#define _DBUS_ALIGNOF(type) \
|
||||
(_DBUS_STRUCT_OFFSET (struct { char _1; type _2; }, _2))
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue