1*4882a593SmuzhiyunFrom 6ef0094fa931b86c42125a8ee357b2f0e3156254 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Florian Weimer <fweimer@redhat.com>
3*4882a593SmuzhiyunDate: Thu, 7 Feb 2019 09:03:02 +0100
4*4882a593SmuzhiyunSubject: [PATCH 01/20] array_length: Make usable as a constant expression
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunDo not use a statement expression in array_length, so that
7*4882a593Smuzhiyunarray_length can be used at file scope and as a constant expression.
8*4882a593SmuzhiyunInstead, put the _Static_assert into a struct (as a declaration),
9*4882a593Smuzhiyunand nest this in the expression using a sizeof expression.
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun(cherry picked from commit 8311c83f91a3127ccd2fe684e25bc60c5178d23b)
12*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
13*4882a593Smuzhiyun---
14*4882a593Smuzhiyun include/array_length.h | 12 ++++++------
15*4882a593Smuzhiyun 1 file changed, 6 insertions(+), 6 deletions(-)
16*4882a593Smuzhiyun
17*4882a593Smuzhiyundiff --git a/include/array_length.h b/include/array_length.h
18*4882a593Smuzhiyunindex 94bf2b2d..29087a7d 100644
19*4882a593Smuzhiyun--- a/include/array_length.h
20*4882a593Smuzhiyun+++ b/include/array_length.h
21*4882a593Smuzhiyun@@ -22,12 +22,12 @@
22*4882a593Smuzhiyun /* array_length (VAR) is the number of elements in the array VAR.  VAR
23*4882a593Smuzhiyun    must evaluate to an array, not a pointer.  */
24*4882a593Smuzhiyun #define array_length(var)                                               \
25*4882a593Smuzhiyun-  __extension__ ({                                                      \
26*4882a593Smuzhiyun-    _Static_assert (!__builtin_types_compatible_p                       \
27*4882a593Smuzhiyun-                    (__typeof (var), __typeof (&(var)[0])),             \
28*4882a593Smuzhiyun-                    "argument must be an array");                       \
29*4882a593Smuzhiyun-    sizeof (var) / sizeof ((var)[0]);                                   \
30*4882a593Smuzhiyun-  })
31*4882a593Smuzhiyun+  (sizeof (var) / sizeof ((var)[0])                                     \
32*4882a593Smuzhiyun+   + 0 * sizeof (struct {                                               \
33*4882a593Smuzhiyun+       _Static_assert (!__builtin_types_compatible_p                    \
34*4882a593Smuzhiyun+                       (__typeof (var), __typeof (&(var)[0])),          \
35*4882a593Smuzhiyun+                       "argument must be an array");                    \
36*4882a593Smuzhiyun+   }))
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun /* array_end (VAR) is a pointer one past the end of the array VAR.
39*4882a593Smuzhiyun    VAR must evaluate to an array, not a pointer.  */
40*4882a593Smuzhiyun--
41*4882a593Smuzhiyun2.20.1
42*4882a593Smuzhiyun
43