array_length: Make usable as a constant expression
Do not use a statement expression in array_length, so that array_length can be used at file scope and as a constant expression. Instead, put the _Static_assert into a struct (as a declaration), and nest this in the expression using a sizeof expression.
This commit is contained in:
parent
94b63e6620
commit
8311c83f91
@ -1,3 +1,9 @@
|
||||
2019-02-07 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
* include/array_length.h (array_length): Do not use a statement
|
||||
expression and _Static_assert, so that array_length can be used at
|
||||
file scope and as a constant expression.
|
||||
|
||||
2019-02-07 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
* support/xdlfcn.h (xdlmopen): Declare.
|
||||
|
@ -22,12 +22,12 @@
|
||||
/* array_length (VAR) is the number of elements in the array VAR. VAR
|
||||
must evaluate to an array, not a pointer. */
|
||||
#define array_length(var) \
|
||||
__extension__ ({ \
|
||||
(sizeof (var) / sizeof ((var)[0]) \
|
||||
+ 0 * sizeof (struct { \
|
||||
_Static_assert (!__builtin_types_compatible_p \
|
||||
(__typeof (var), __typeof (&(var)[0])), \
|
||||
"argument must be an array"); \
|
||||
sizeof (var) / sizeof ((var)[0]); \
|
||||
})
|
||||
}))
|
||||
|
||||
/* array_end (VAR) is a pointer one past the end of the array VAR.
|
||||
VAR must evaluate to an array, not a pointer. */
|
||||
|
Loading…
Reference in New Issue
Block a user