aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--include/array_length.h12
2 files changed, 12 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 1c477228f3..3270662983 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
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.
* support/xdlmopen.c: New file.
* support/Makefile (libsupport-routines): Add xdlmopen.
diff --git a/include/array_length.h b/include/array_length.h
index 65f583063d..db98a69899 100644
--- a/include/array_length.h
+++ b/include/array_length.h
@@ -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__ ({ \
- _Static_assert (!__builtin_types_compatible_p \
- (__typeof (var), __typeof (&(var)[0])), \
- "argument must be an array"); \
- sizeof (var) / sizeof ((var)[0]); \
- })
+ (sizeof (var) / sizeof ((var)[0]) \
+ + 0 * sizeof (struct { \
+ _Static_assert (!__builtin_types_compatible_p \
+ (__typeof (var), __typeof (&(var)[0])), \
+ "argument must be an array"); \
+ }))
/* array_end (VAR) is a pointer one past the end of the array VAR.
VAR must evaluate to an array, not a pointer. */