Jim Meyering wrote: > Ok to push this fix? > > + * tests/test-select-stdin.c: Include <string.h> for decl of memset,
No. test-select-stdin.c does not use memset(), therefore there is no reason for this file to include <string.h>. The memset() call that the warnings refers to comes from an FD_ZERO expansion. The problem is that Solaris' <sys/select.h> is only really complete when accompanied with a #include <string.h>. So let's fix that. I'm applying this: 2009-08-09 Bruno Haible <br...@clisp.org> Make <sys/select.h> really self-contained, also on Solaris 10. * lib/sys_select.in.h: Include <string.h>. * m4/sys_select_h.m4 (gl_HEADER_SYS_SELECT): Test also against Solaris 10 problem. * tests/test-sys_select.c (main): Add check that FD_ZERO can be used. * doc/posix-headers/sys_select.texi: Mention the Solaris 10 problem. Reported by Jim Meyering. --- doc/posix-headers/sys_select.texi.orig 2009-08-10 00:20:23.000000000 +0200 +++ doc/posix-headers/sys_select.texi 2009-08-09 23:55:27.000000000 +0200 @@ -16,6 +16,10 @@ @item This header file does not define @code{struct timeval} on some platforms: OSF/1 4.0. +...@item +This header file is not self-contained --- it requires @code{<string.h>} +before @code{FD_ZERO} can be used --- on some platforms: +Solaris 10. @end itemize Portability problems not fixed by Gnulib: --- lib/sys_select.in.h.orig 2009-08-10 00:20:23.000000000 +0200 +++ lib/sys_select.in.h 2009-08-09 23:58:22.000000000 +0200 @@ -42,9 +42,13 @@ # include <sys/types.h> /* On OSF/1 4.0, <sys/select.h> provides only a forward declaration - of 'struct timeval', and no definition of this type.. */ + of 'struct timeval', and no definition of this type. */ # include <sys/time.h> +/* On Solaris 10, <sys/select.h> provides an FD_ZERO implementation + that relies on memset(), but without including <string.h>. */ +# include <string.h> + /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@ --- m4/sys_select_h.m4.orig 2009-08-10 00:20:23.000000000 +0200 +++ m4/sys_select_h.m4 2009-08-10 00:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -# sys_select_h.m4 serial 7 +# sys_select_h.m4 serial 8 dnl Copyright (C) 2006-2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -11,10 +11,39 @@ AC_CACHE_CHECK([whether <sys/select.h> is self-contained], [gl_cv_header_sys_select_h_selfcontained], [ + dnl Test against two bugs: + dnl 1. On many platforms, <sys/select.h> assumes prior inclusion of + dnl <sys/types.h>. + dnl 2. On OSF/1 4.0, <sys/select.h> provides only a forward declaration + dnl of 'struct timeval', and no definition of this type. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/select.h>]], [[struct timeval b;]])], [gl_cv_header_sys_select_h_selfcontained=yes], [gl_cv_header_sys_select_h_selfcontained=no]) + dnl Test against another bug: + dnl 3. On Solaris 10, <sys/select.h> provides an FD_ZERO implementation + dnl that relies on memset(), but without including <string.h>. + if test $gl_cv_header_sys_select_h_selfcontained = yes; then + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include <sys/select.h>]], + [[int memset; int bzero;]]) + ], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[#include <sys/select.h>]], [[ + #undef memset + #define memset nonexistent_memset + extern void *memset (void *, int, unsigned long); + #undef bzero + #define bzero nonexistent_bzero + extern void bzero (void *, unsigned long); + fd_set fds; + FD_ZERO (&fds); + ]]) + ], + [], + [gl_cv_header_sys_select_h_selfcontained=no]) + ]) + fi ]) if test $gl_cv_header_sys_select_h_selfcontained = yes; then SYS_SELECT_H='' --- tests/test-sys_select.c.orig 2009-08-10 00:20:23.000000000 +0200 +++ tests/test-sys_select.c 2009-08-09 23:50:11.000000000 +0200 @@ -1,5 +1,5 @@ /* Test of <sys/select.h> substitute. - Copyright (C) 2007-2008 Free Software Foundation, Inc. + Copyright (C) 2007-2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,5 +26,10 @@ int main () { + /* Check that FD_ZERO can be used. This should not yield a warning + such as "warning: implicit declaration of function 'memset'". */ + fd_set fds; + FD_ZERO (&fds); + return 0; }