+2026-02-23 Bruno Haible <bruno@clisp.org>
+
+ strnul: Accept 'void *' and 'const void *' arguments in C mode.
+ Reported by Paul Eggert in
+ <https://lists.gnu.org/archive/html/bug-gnulib/2026-02/msg00170.html>.
+ * lib/string.in.h (strnul): Use a conditional expression in _Generic.
+ * tests/test-strnul.c (main): Add test cases with 'void *' argument.
+
2026-02-23 Bruno Haible <bruno@clisp.org>
fts: Relicense some of its source code under LGPLv2+.
|| (defined __SUNPRO_C && __SUNPRO_C >= 0x5150) \
|| (__STDC_VERSION__ >= 201112L && !defined __GNUC__)
/* The compiler supports _Generic from ISO C11. */
+/* Since in C (but not in C++!), any function that accepts a '[const] char *'
+ also accepts a '[const] void *' as argument, we make sure that the function-
+ like macro does the same, by mapping its type first:
+ char *, void * -> void *
+ const char *, const void * -> const void *
+ This mapping is done through the conditional expression. */
# define strnul(s) \
- _Generic (s, \
- char * : (char *) gl_strnul (s), \
- const char * : gl_strnul (s))
+ _Generic (1 ? (s) : (void *) 99, \
+ void * : (char *) gl_strnul (s), \
+ const void * : gl_strnul (s))
# else
# define strnul(s) \
((char *) gl_strnul (s))
ASSERT (ro_nul - ro == 3);
ASSERT (rw_nul - rw == 3);
+#if !defined __cplusplus
+ const char *rov_nul = strnul ((const void *) ro);
+ char *rwv_nul = strnul ((void *) rw);
+
+ ASSERT (rov_nul - ro == 3);
+ ASSERT (rwv_nul - rw == 3);
+#endif
+
return test_exit_status;
}