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