* [PATCH v4] <sys/param.h>: Add nitems()
@ 2020-09-28 19:12 Alejandro Colomar via Libc-alpha
2020-10-11 16:43 ` Ping: " Alejandro Colomar via Libc-alpha
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Alejandro Colomar via Libc-alpha @ 2020-09-28 19:12 UTC (permalink / raw)
To: libc-alpha
Cc: fweimer, gcc, ville.voutilainen, linux-man, Alejandro Colomar,
rusty, linux-kernel, libstdc++, libc-coord, jwakely, enh
'nitems()' calculates the length of an array in number of items.
It is safe: if a pointer is passed to the macro (or function, in C++),
the compilation is broken due to:
- In >= C11: _Static_assert()
- In C89, C99: Negative anonymous bitfield
- In C++: The template requires an array
Some BSDs already provide a macro nitems() in <sys/param.h>,
although it usually doesn't provide safety against pointers.
This patch uses the same name for compatibility reasons,
and to be the least disruptive with existing code.
This patch also adds some other macros, which are required by 'nitems()':
__is_same_type(a, b):
Returns non-zero if the two input arguments are of the same type.
__is_array(arr):
Returns non-zero if the input argument is of an array type.
__must_be(expr, msg):
Allows using _Static_assert() everywhere an expression can be used.
It evaluates '(int)0' or breaks the compilation.
__must_be_array(arr):
It evaluates to '(int)0' if the argument is of an array type.
Else, it breaks compilation.
__nitems(arr):
It implements the basic sizeof division needed to calculate the array length.
P.S.: I'd like to put this patch in the public domain.
Signed-off-by: Alejandro Colomar <colomar.6.4.3@gmail.com>
---
A few changes since v3:
- Macros don't need reserved names in their parameters,
so I simplified those names.
- I fixed some wrong indentation levels.
- Renamed __array_len() to __nitems() for consistency.
misc/sys/param.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/misc/sys/param.h b/misc/sys/param.h
index d7c319b157..08d4093961 100644
--- a/misc/sys/param.h
+++ b/misc/sys/param.h
@@ -102,5 +102,52 @@
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
+/* Macros related to the types of variables */
+#define __is_same_type(a, b) \
+ __builtin_types_compatible_p(__typeof__(a), __typeof__(b))
+#define __is_array(arr) (!__is_same_type((arr), &(arr)[0]))
+
+/* Macros for embedding _Static_assert() in expressions */
+#if __STDC_VERSION__ >= 201112L
+# define __must_be(expr, msg) ( \
+ 0 * (int)sizeof( \
+ struct { \
+ _Static_assert((expr), msg); \
+ char _ISO_C_forbids_a_struct_with_no_members; \
+ } \
+ ) \
+)
+#else
+# define __must_be(expr, msg) ( \
+ 0 * (int)sizeof( \
+ struct { \
+ int : (-!(expr)); \
+ char _ISO_C_forbids_a_struct_with_no_members; \
+ } \
+ ) \
+)
+#endif
+#define __must_be_array(arr) __must_be(__is_array(arr), "Must be an array!")
+
+/* Macros for array sizes */
+#if defined(__cplusplus)
+# if __cplusplus >= 201103L
+template<typename _Tp, std::size_t _Len>
+ constexpr inline std::size_t
+ nitems(const _Tp(&)[_Len]) __THROW
+ {
+ return _Len;
+ }
+# else /* __cplusplus < 201103L */
+template<typename _Tp, std::size_t _Len>
+ char
+ (&__nitems_chararr(const _Tp(&)[_Len]))[_Len];
+# define nitems(arr) (sizeof(__nitems_chararr(arr)))
+# endif /* __cplusplus < 201103L */
+#else /* !defined(__cplusplus) */
+# define __nitems(arr) (sizeof((arr)) / sizeof((arr)[0]))
+# define nitems(arr) (__nitems(arr) + __must_be_array(arr))
+#endif /* !defined(__cplusplus) */
+
#endif /* sys/param.h */
--
2.28.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Ping: Re: [PATCH v4] <sys/param.h>: Add nitems()
2020-09-28 19:12 [PATCH v4] <sys/param.h>: Add nitems() Alejandro Colomar via Libc-alpha
@ 2020-10-11 16:43 ` Alejandro Colomar via Libc-alpha
2020-10-27 11:38 ` Ping(2): " Alejandro Colomar via Libc-alpha
2020-11-17 22:23 ` Ping(3): " Alejandro Colomar via Libc-alpha
2 siblings, 0 replies; 8+ messages in thread
From: Alejandro Colomar via Libc-alpha @ 2020-10-11 16:43 UTC (permalink / raw)
To: libc-alpha
Cc: fweimer, gcc, ville.voutilainen, linux-man, rusty, linux-kernel,
libstdc++, libc-coord, jwakely, enh
Ping.
On 2020-09-28 21:12, Alejandro Colomar wrote:
> 'nitems()' calculates the length of an array in number of items.
> It is safe: if a pointer is passed to the macro (or function, in C++),
> the compilation is broken due to:
> - In >= C11: _Static_assert()
> - In C89, C99: Negative anonymous bitfield
> - In C++: The template requires an array
>
> Some BSDs already provide a macro nitems() in <sys/param.h>,
> although it usually doesn't provide safety against pointers.
>
> This patch uses the same name for compatibility reasons,
> and to be the least disruptive with existing code.
>
> This patch also adds some other macros, which are required by 'nitems()':
>
> __is_same_type(a, b):
> Returns non-zero if the two input arguments are of the same type.
>
> __is_array(arr):
> Returns non-zero if the input argument is of an array type.
>
> __must_be(expr, msg):
> Allows using _Static_assert() everywhere an expression can be used.
> It evaluates '(int)0' or breaks the compilation.
>
> __must_be_array(arr):
> It evaluates to '(int)0' if the argument is of an array type.
> Else, it breaks compilation.
>
> __nitems(arr):
> It implements the basic sizeof division needed to calculate the array length.
>
>
> P.S.: I'd like to put this patch in the public domain.
>
> Signed-off-by: Alejandro Colomar <colomar.6.4.3@gmail.com>
> ---
>
> A few changes since v3:
>
> - Macros don't need reserved names in their parameters,
> so I simplified those names.
>
> - I fixed some wrong indentation levels.
>
> - Renamed __array_len() to __nitems() for consistency.
>
>
> misc/sys/param.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 47 insertions(+)
>
> diff --git a/misc/sys/param.h b/misc/sys/param.h
> index d7c319b157..08d4093961 100644
> --- a/misc/sys/param.h
> +++ b/misc/sys/param.h
> @@ -102,5 +102,52 @@
> #define MIN(a,b) (((a)<(b))?(a):(b))
> #define MAX(a,b) (((a)>(b))?(a):(b))
>
> +/* Macros related to the types of variables */
> +#define __is_same_type(a, b) \
> + __builtin_types_compatible_p(__typeof__(a), __typeof__(b))
> +#define __is_array(arr) (!__is_same_type((arr), &(arr)[0]))
> +
> +/* Macros for embedding _Static_assert() in expressions */
> +#if __STDC_VERSION__ >= 201112L
> +# define __must_be(expr, msg) ( \
> + 0 * (int)sizeof( \
> + struct { \
> + _Static_assert((expr), msg); \
> + char _ISO_C_forbids_a_struct_with_no_members; \
> + } \
> + ) \
> +)
> +#else
> +# define __must_be(expr, msg) ( \
> + 0 * (int)sizeof( \
> + struct { \
> + int : (-!(expr)); \
> + char _ISO_C_forbids_a_struct_with_no_members; \
> + } \
> + ) \
> +)
> +#endif
> +#define __must_be_array(arr) __must_be(__is_array(arr), "Must be an array!")
> +
> +/* Macros for array sizes */
> +#if defined(__cplusplus)
> +# if __cplusplus >= 201103L
> +template<typename _Tp, std::size_t _Len>
> + constexpr inline std::size_t
> + nitems(const _Tp(&)[_Len]) __THROW
> + {
> + return _Len;
> + }
> +# else /* __cplusplus < 201103L */
> +template<typename _Tp, std::size_t _Len>
> + char
> + (&__nitems_chararr(const _Tp(&)[_Len]))[_Len];
> +# define nitems(arr) (sizeof(__nitems_chararr(arr)))
> +# endif /* __cplusplus < 201103L */
> +#else /* !defined(__cplusplus) */
> +# define __nitems(arr) (sizeof((arr)) / sizeof((arr)[0]))
> +# define nitems(arr) (__nitems(arr) + __must_be_array(arr))
> +#endif /* !defined(__cplusplus) */
> +
>
> #endif /* sys/param.h */
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Ping(2): [PATCH v4] <sys/param.h>: Add nitems()
2020-09-28 19:12 [PATCH v4] <sys/param.h>: Add nitems() Alejandro Colomar via Libc-alpha
2020-10-11 16:43 ` Ping: " Alejandro Colomar via Libc-alpha
@ 2020-10-27 11:38 ` Alejandro Colomar via Libc-alpha
2020-11-17 22:23 ` Ping(3): " Alejandro Colomar via Libc-alpha
2 siblings, 0 replies; 8+ messages in thread
From: Alejandro Colomar via Libc-alpha @ 2020-10-27 11:38 UTC (permalink / raw)
To: libc-alpha, libc-coord
Cc: fweimer, gcc, ville.voutilainen, linux-man, rusty, linux-kernel,
libstdc++, jwakely, enh
Ping
On 2020-09-28 21:12, Alejandro Colomar wrote:
> 'nitems()' calculates the length of an array in number of items.
> It is safe: if a pointer is passed to the macro (or function, in C++),
> the compilation is broken due to:
> - In >= C11: _Static_assert()
> - In C89, C99: Negative anonymous bitfield
> - In C++: The template requires an array
>
> Some BSDs already provide a macro nitems() in <sys/param.h>,
> although it usually doesn't provide safety against pointers.
>
> This patch uses the same name for compatibility reasons,
> and to be the least disruptive with existing code.
>
> This patch also adds some other macros, which are required by 'nitems()':
>
> __is_same_type(a, b):
> Returns non-zero if the two input arguments are of the same type.
>
> __is_array(arr):
> Returns non-zero if the input argument is of an array type.
>
> __must_be(expr, msg):
> Allows using _Static_assert() everywhere an expression can be used.
> It evaluates '(int)0' or breaks the compilation.
>
> __must_be_array(arr):
> It evaluates to '(int)0' if the argument is of an array type.
> Else, it breaks compilation.
>
> __nitems(arr):
> It implements the basic sizeof division needed to calculate the array length.
>
>
> P.S.: I'd like to put this patch in the public domain.
>
> Signed-off-by: Alejandro Colomar <colomar.6.4.3@gmail.com>
> ---
>
> A few changes since v3:
>
> - Macros don't need reserved names in their parameters,
> so I simplified those names.
>
> - I fixed some wrong indentation levels.
>
> - Renamed __array_len() to __nitems() for consistency.
>
>
> misc/sys/param.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 47 insertions(+)
>
> diff --git a/misc/sys/param.h b/misc/sys/param.h
> index d7c319b157..08d4093961 100644
> --- a/misc/sys/param.h
> +++ b/misc/sys/param.h
> @@ -102,5 +102,52 @@
> #define MIN(a,b) (((a)<(b))?(a):(b))
> #define MAX(a,b) (((a)>(b))?(a):(b))
>
> +/* Macros related to the types of variables */
> +#define __is_same_type(a, b) \
> + __builtin_types_compatible_p(__typeof__(a), __typeof__(b))
> +#define __is_array(arr) (!__is_same_type((arr), &(arr)[0]))
> +
> +/* Macros for embedding _Static_assert() in expressions */
> +#if __STDC_VERSION__ >= 201112L
> +# define __must_be(expr, msg) ( \
> + 0 * (int)sizeof( \
> + struct { \
> + _Static_assert((expr), msg); \
> + char _ISO_C_forbids_a_struct_with_no_members; \
> + } \
> + ) \
> +)
> +#else
> +# define __must_be(expr, msg) ( \
> + 0 * (int)sizeof( \
> + struct { \
> + int : (-!(expr)); \
> + char _ISO_C_forbids_a_struct_with_no_members; \
> + } \
> + ) \
> +)
> +#endif
> +#define __must_be_array(arr) __must_be(__is_array(arr), "Must be an array!")
> +
> +/* Macros for array sizes */
> +#if defined(__cplusplus)
> +# if __cplusplus >= 201103L
> +template<typename _Tp, std::size_t _Len>
> + constexpr inline std::size_t
> + nitems(const _Tp(&)[_Len]) __THROW
> + {
> + return _Len;
> + }
> +# else /* __cplusplus < 201103L */
> +template<typename _Tp, std::size_t _Len>
> + char
> + (&__nitems_chararr(const _Tp(&)[_Len]))[_Len];
> +# define nitems(arr) (sizeof(__nitems_chararr(arr)))
> +# endif /* __cplusplus < 201103L */
> +#else /* !defined(__cplusplus) */
> +# define __nitems(arr) (sizeof((arr)) / sizeof((arr)[0]))
> +# define nitems(arr) (__nitems(arr) + __must_be_array(arr))
> +#endif /* !defined(__cplusplus) */
> +
>
> #endif /* sys/param.h */
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Ping(3): [PATCH v4] <sys/param.h>: Add nitems()
2020-09-28 19:12 [PATCH v4] <sys/param.h>: Add nitems() Alejandro Colomar via Libc-alpha
2020-10-11 16:43 ` Ping: " Alejandro Colomar via Libc-alpha
2020-10-27 11:38 ` Ping(2): " Alejandro Colomar via Libc-alpha
@ 2020-11-17 22:23 ` Alejandro Colomar via Libc-alpha
2020-11-17 22:44 ` Joseph Myers
2 siblings, 1 reply; 8+ messages in thread
From: Alejandro Colomar via Libc-alpha @ 2020-11-17 22:23 UTC (permalink / raw)
To: libc-alpha, libc-coord
Cc: fweimer, gcc, ville.voutilainen, linux-man, rusty, linux-kernel,
libstdc++, jwakely, enh
Hi,
Do you think the patch is ready,
or is there anything else I should do before merging it?
Thanks,
Alex
On 9/28/20 9:12 PM, Alejandro Colomar wrote:
> 'nitems()' calculates the length of an array in number of items.
> It is safe: if a pointer is passed to the macro (or function, in C++),
> the compilation is broken due to:
> - In >= C11: _Static_assert()
> - In C89, C99: Negative anonymous bitfield
> - In C++: The template requires an array
>
> Some BSDs already provide a macro nitems() in <sys/param.h>,
> although it usually doesn't provide safety against pointers.
>
> This patch uses the same name for compatibility reasons,
> and to be the least disruptive with existing code.
>
> This patch also adds some other macros, which are required by 'nitems()':
>
> __is_same_type(a, b):
> Returns non-zero if the two input arguments are of the same type.
>
> __is_array(arr):
> Returns non-zero if the input argument is of an array type.
>
> __must_be(expr, msg):
> Allows using _Static_assert() everywhere an expression can be used.
> It evaluates '(int)0' or breaks the compilation.
>
> __must_be_array(arr):
> It evaluates to '(int)0' if the argument is of an array type.
> Else, it breaks compilation.
>
> __nitems(arr):
> It implements the basic sizeof division needed to calculate the array length.
>
>
> P.S.: I'd like to put this patch in the public domain.
>
> Signed-off-by: Alejandro Colomar <colomar.6.4.3@gmail.com>
> ---
>
> A few changes since v3:
>
> - Macros don't need reserved names in their parameters,
> so I simplified those names.
>
> - I fixed some wrong indentation levels.
>
> - Renamed __array_len() to __nitems() for consistency.
>
>
> misc/sys/param.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 47 insertions(+)
>
> diff --git a/misc/sys/param.h b/misc/sys/param.h
> index d7c319b157..08d4093961 100644
> --- a/misc/sys/param.h
> +++ b/misc/sys/param.h
> @@ -102,5 +102,52 @@
> #define MIN(a,b) (((a)<(b))?(a):(b))
> #define MAX(a,b) (((a)>(b))?(a):(b))
>
> +/* Macros related to the types of variables */
> +#define __is_same_type(a, b) \
> + __builtin_types_compatible_p(__typeof__(a), __typeof__(b))
> +#define __is_array(arr) (!__is_same_type((arr), &(arr)[0]))
> +
> +/* Macros for embedding _Static_assert() in expressions */
> +#if __STDC_VERSION__ >= 201112L
> +# define __must_be(expr, msg) ( \
> + 0 * (int)sizeof( \
> + struct { \
> + _Static_assert((expr), msg); \
> + char _ISO_C_forbids_a_struct_with_no_members; \
> + } \
> + ) \
> +)
> +#else
> +# define __must_be(expr, msg) ( \
> + 0 * (int)sizeof( \
> + struct { \
> + int : (-!(expr)); \
> + char _ISO_C_forbids_a_struct_with_no_members; \
> + } \
> + ) \
> +)
> +#endif
> +#define __must_be_array(arr) __must_be(__is_array(arr), "Must be an array!")
> +
> +/* Macros for array sizes */
> +#if defined(__cplusplus)
> +# if __cplusplus >= 201103L
> +template<typename _Tp, std::size_t _Len>
> + constexpr inline std::size_t
> + nitems(const _Tp(&)[_Len]) __THROW
> + {
> + return _Len;
> + }
> +# else /* __cplusplus < 201103L */
> +template<typename _Tp, std::size_t _Len>
> + char
> + (&__nitems_chararr(const _Tp(&)[_Len]))[_Len];
> +# define nitems(arr) (sizeof(__nitems_chararr(arr)))
> +# endif /* __cplusplus < 201103L */
> +#else /* !defined(__cplusplus) */
> +# define __nitems(arr) (sizeof((arr)) / sizeof((arr)[0]))
> +# define nitems(arr) (__nitems(arr) + __must_be_array(arr))
> +#endif /* !defined(__cplusplus) */
> +
>
> #endif /* sys/param.h */
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Ping(3): [PATCH v4] <sys/param.h>: Add nitems()
2020-11-17 22:23 ` Ping(3): " Alejandro Colomar via Libc-alpha
@ 2020-11-17 22:44 ` Joseph Myers
2020-11-17 22:59 ` Alejandro Colomar via Libc-alpha
0 siblings, 1 reply; 8+ messages in thread
From: Joseph Myers @ 2020-11-17 22:44 UTC (permalink / raw)
To: Alejandro Colomar
Cc: fweimer, gcc, ville.voutilainen, linux-man, rusty, linux-kernel,
libstdc++, libc-coord, libc-alpha, jwakely, enh
I've asked the WG14 reflector why N2529 (and N2530, though that one's not
relevant to this feature) doesn't seem to have made it onto a meeting
agenda yet, when there have been two WG14 meetings since that proposal was
made and a third one coming up.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Ping(3): [PATCH v4] <sys/param.h>: Add nitems()
2020-11-17 22:44 ` Joseph Myers
@ 2020-11-17 22:59 ` Alejandro Colomar via Libc-alpha
2020-11-17 23:11 ` Joseph Myers
0 siblings, 1 reply; 8+ messages in thread
From: Alejandro Colomar via Libc-alpha @ 2020-11-17 22:59 UTC (permalink / raw)
To: Joseph Myers
Cc: fweimer, gcc, ville.voutilainen, linux-man, rusty, linux-kernel,
libstdc++, libc-coord, libc-alpha, jwakely, enh
Hi Joseph,
On 11/17/20 11:44 PM, Joseph Myers wrote:
> I've asked the WG14 reflector why N2529 (and N2530, though that one's not
> relevant to this feature) doesn't seem to have made it onto a meeting
> agenda yet, when there have been two WG14 meetings since that proposal
was
> made and a third one coming up.
>
Nice!
Please update me on any feedback you receive.
So glibc will basically hold this patch
at least until the WG answers to that, right?
Thanks,
Alex
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Ping(3): [PATCH v4] <sys/param.h>: Add nitems()
2020-11-17 22:59 ` Alejandro Colomar via Libc-alpha
@ 2020-11-17 23:11 ` Joseph Myers
2020-11-18 11:26 ` Alejandro Colomar via Libc-alpha
0 siblings, 1 reply; 8+ messages in thread
From: Joseph Myers @ 2020-11-17 23:11 UTC (permalink / raw)
To: Alejandro Colomar
Cc: fweimer, gcc, ville.voutilainen, linux-man, rusty, linux-kernel,
libstdc++, libc-coord, libc-alpha, jwakely, enh
On Tue, 17 Nov 2020, Alejandro Colomar via Libc-alpha wrote:
> Nice!
> Please update me on any feedback you receive.
Apparently the author is planning new versions of those papers so WG14
discussion is waiting for those.
> So glibc will basically hold this patch
> at least until the WG answers to that, right?
I think that whether C2x gets an array-size feature of some kind is
relevant to whether such a feature goes in glibc and what it looks like in
glibc, but the fact that it will be considered in WG14 doesn't rule out
glibc considering such a feature without waiting for WG14.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Ping(3): [PATCH v4] <sys/param.h>: Add nitems()
2020-11-17 23:11 ` Joseph Myers
@ 2020-11-18 11:26 ` Alejandro Colomar via Libc-alpha
0 siblings, 0 replies; 8+ messages in thread
From: Alejandro Colomar via Libc-alpha @ 2020-11-18 11:26 UTC (permalink / raw)
To: Joseph Myers
Cc: fweimer, gcc, ville.voutilainen, linux-man, rusty, linux-kernel,
libstdc++, libc-coord, libc-alpha, jwakely, enh
On 11/18/20 12:11 AM, Joseph Myers wrote:
> On Tue, 17 Nov 2020, Alejandro Colomar via Libc-alpha wrote:
>
>> Nice!
>> Please update me on any feedback you receive.
>
> Apparently the author is planning new versions of those papers so WG14
> discussion is waiting for those.
>
>> So glibc will basically hold this patch
>> at least until the WG answers to that, right?
>
> I think that whether C2x gets an array-size feature of some kind is
> relevant to whether such a feature goes in glibc and what it looks like in
> glibc, but the fact that it will be considered in WG14 doesn't rule out
> glibc considering such a feature without waiting for WG14.
>
Hi Joseph,
Yes, that's what I would expect, but it's been a long time since I sent
the patch, so that's why I asked.
Maybe glibc is busy now with other more urgent things, I don't know.
Thanks,
Alex
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2020-11-18 11:26 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-28 19:12 [PATCH v4] <sys/param.h>: Add nitems() Alejandro Colomar via Libc-alpha
2020-10-11 16:43 ` Ping: " Alejandro Colomar via Libc-alpha
2020-10-27 11:38 ` Ping(2): " Alejandro Colomar via Libc-alpha
2020-11-17 22:23 ` Ping(3): " Alejandro Colomar via Libc-alpha
2020-11-17 22:44 ` Joseph Myers
2020-11-17 22:59 ` Alejandro Colomar via Libc-alpha
2020-11-17 23:11 ` Joseph Myers
2020-11-18 11:26 ` Alejandro Colomar via Libc-alpha
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).