mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/include: avoid using a compiler extension for BUILD_BUG_ON_ZERO
Redefine BUILD_BUG_ON_ZERO to avoid using a compiler extension
that gives an acceptable semantics to C99 undefined behavior 58
("A structure or union is defined as containing no named members
(6.7.2.1)").
The first definition includes an additional named field of type
char.
The chosen ill-formed construct for the second definition is a struct
with a named bitfield of width 0 when the condition is true,
which prevents the UB without using the compiler extension while keeping
the semantic of the construct.
The choice of the bitwise AND operation to bring the result to 0
when cond is false boils down to possibly better portability.
Signed-off-by: Nicola Vetrini <nicola.vetrini@bugseng.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
1 parent
ac27b3beb9
commit
5c02dbd0e0
1 file changed
+3
-2
@@ -51,9 +51,10 @@
|
||||
e.g. in a structure initializer (or where-ever else comma expressions
|
||||
aren't permitted). */
|
||||
#define BUILD_BUG_ON_ZERO(cond) \
|
||||
sizeof(struct { _Static_assert(!(cond), "!(" #cond ")"); })
|
||||
(sizeof(struct { char c; _Static_assert(!(cond), "!(" #cond ")"); }) & 0)
|
||||
#else
|
||||
#define BUILD_BUG_ON_ZERO(cond) sizeof(struct { int:-!!(cond); })
|
||||
#define BUILD_BUG_ON_ZERO(cond) \
|
||||
(sizeof(struct { unsigned u : !(cond); }) & 0)
|
||||
#define BUILD_BUG_ON(cond) ((void)BUILD_BUG_ON_ZERO(cond))
|
||||
#endif
|
||||
|
||||
|
||||