From: Simon McVittie Date: Fri, 10 Dec 2021 15:12:59 +0000 (+0000) Subject: internals: Use Standard C offsetof macro if available X-Git-Tag: dbus-1.13.20~8^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a24cf746e2a8191070efd1300a15d37284aaf2fa;p=thirdparty%2Fdbus.git 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 --- diff --git a/dbus/dbus-internals.h b/dbus/dbus-internals.h index 73443e232..3b293b057 100644 --- a/dbus/dbus-internals.h +++ b/dbus/dbus-internals.h @@ -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))