This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
MinGW compilation warnings in libiberty's include/environ.h
- From: Eli Zaretskii <eliz at gnu dot org>
- To: gcc-patches at gcc dot gnu dot org
- Cc: gdb-patches at sourceware dot org
- Date: Mon, 08 May 2017 18:25:17 +0300
- Subject: MinGW compilation warnings in libiberty's include/environ.h
- Authentication-results: sourceware.org; auth=none
- Reply-to: Eli Zaretskii <eliz at gnu dot org>
When compiling libiberty (as part of GDB) with MinGW on MS-Windows, I
see the following warning:
gcc -c -DHAVE_CONFIG_H -O2 -gdwarf-4 -g3 -D__USE_MINGW_ACCESS -I. -I./../include -W -Wall -Wwrite-strings -Wc++-compat -Wstrict-prototypes -pedantic -D_GNU_SOURCE ./setenv.c -o setenv.o
In file included from ./setenv.c:64:0:
./../include/environ.h:30:1: warning: function declaration isn't a prototype [-Wstrict-prototypes]
extern char **environ;
^
This was already reported 4 years ago, here:
https://gcc.gnu.org/ml/gcc-patches/2013-03/msg00471.html
and was solved back then. But it looks like the offending code was
copied to include/environ.h without the fix, and the warning is thus
back.
The problem is with this code in environ.h:
#ifndef HAVE_ENVIRON_DECL
# ifdef __APPLE__
# include <crt_externs.h>
# define environ (*_NSGetEnviron ())
# else
extern char **environ;
# endif
# define HAVE_ENVIRON_DECL
#endif
which causes the MinGW compiler to see the declaration of environ,
whereas MinGW's stdlib.h has this:
#ifdef __MSVCRT__
# define _environ (*__p__environ())
extern _CRTIMP __cdecl __MINGW_NOTHROW char ***__p__environ(void);
# define _wenviron (*__p__wenviron())
extern _CRTIMP __cdecl __MINGW_NOTHROW wchar_t ***__p__wenviron(void);
#else /* ! __MSVCRT__ */
# ifndef __DECLSPEC_SUPPORTED
# define _environ (*_imp___environ_dll)
extern char ***_imp___environ_dll;
# else /* __DECLSPEC_SUPPORTED */
# define _environ _environ_dll
__MINGW_IMPORT char ** _environ_dll;
# endif /* __DECLSPEC_SUPPORTED */
#endif /* ! __MSVCRT__ */
#define environ _environ
Can this be fixed again, please? The solution, as back then, is this:
#ifndef HAVE_ENVIRON_DECL
# ifdef __APPLE__
# include <crt_externs.h>
# define environ (*_NSGetEnviron ())
# else
# ifndef environ
extern char **environ;
# endif
# endif
# define HAVE_ENVIRON_DECL
#endif
Thanks.