internals: Use Standard C offsetof macro if available
authorSimon McVittie <smcv@collabora.com>
Fri, 10 Dec 2021 15:12:59 +0000 (15:12 +0000)
committerSimon McVittie <smcv@collabora.com>
Fri, 17 Dec 2021 12:57:42 +0000 (12:57 +0000)
commitb44e0cc9f456449e1378e4b03bcb7ad3db094725
tree4e8035518087193942d0d32ba6e8620339f15698
parentd13349f25ce6160695237cb1715bc3a8e2fa8985
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>
(cherry picked from commit a24cf746e2a8191070efd1300a15d37284aaf2fa)
dbus/dbus-internals.h