hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
From 4423ab8fb4650cd0e4906b337ff21ef284893434 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Thu, 7 Feb 2019 09:03:02 +0100
Subject: [PATCH 01/19] 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.
 
(cherry picked from commit 8311c83f91a3127ccd2fe684e25bc60c5178d23b)
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
 include/array_length.h | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
 
diff --git a/include/array_length.h b/include/array_length.h
index 65f58306..db98a698 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.  */
-- 
2.20.1