From 141be0d810330ceec66ce3fab46aaeb4c633bd7e Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 8 Apr 2017 17:26:03 -0700 Subject: [PATCH] getopt: port recent getopt changes to macOS Problem reported by Harald Maier (Bug#26398). The macOS C compiler uses __nonnull for its own purposes and that clashes with glibc's __nonnull. * lib/getopt.in.h: Add comment for _GL_ARG_NONNULL snippet. * lib/getopt_cdefs.in.h (__nonnull): Remove. * lib/getopt_core.h (getopt): * lib/getopt_ext.h (getopt_long, getopt_long_only): Use _GL_ARG_NONNULL, not __nonnull. * lib/unistd.in.h: Move snippet hooks to before where the getopt .h files are included, so that _GL_ARG_NONNULL is defined in time. * modules/getopt-posix (Depends-on): Add snippet/arg-nonnull. (getopt.h): Interpolate _GL_ARG_NONNULL snippet. --- ChangeLog | 16 ++++++++++++++++ lib/getopt.in.h | 2 ++ lib/getopt_cdefs.in.h | 8 -------- lib/getopt_core.h | 2 +- lib/getopt_ext.h | 4 ++-- lib/unistd.in.h | 14 +++++++------- modules/getopt-posix | 2 ++ 7 files changed, 30 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index db893f5..595f2ba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2017-04-08 Paul Eggert + + getopt: port recent getopt changes to macOS + Problem reported by Harald Maier (Bug#26398). + The macOS C compiler uses __nonnull for its own purposes and that + clashes with glibc's __nonnull. + * lib/getopt.in.h: Add comment for _GL_ARG_NONNULL snippet. + * lib/getopt_cdefs.in.h (__nonnull): Remove. + * lib/getopt_core.h (getopt): + * lib/getopt_ext.h (getopt_long, getopt_long_only): + Use _GL_ARG_NONNULL, not __nonnull. + * lib/unistd.in.h: Move snippet hooks to before where the getopt + .h files are included, so that _GL_ARG_NONNULL is defined in time. + * modules/getopt-posix (Depends-on): Add snippet/arg-nonnull. + (getopt.h): Interpolate _GL_ARG_NONNULL snippet. + 2017-04-06 Paul Eggert getopt-gnu: omit some duplicate code diff --git a/lib/getopt.in.h b/lib/getopt.in.h index c3ffd95..9f84c27 100644 --- a/lib/getopt.in.h +++ b/lib/getopt.in.h @@ -52,6 +52,8 @@ # endif #endif +/* The definition of _GL_ARG_NONNULL is copied here. */ + #include #include #include diff --git a/lib/getopt_cdefs.in.h b/lib/getopt_cdefs.in.h index 35a2669..54da28d 100644 --- a/lib/getopt_cdefs.in.h +++ b/lib/getopt_cdefs.in.h @@ -64,12 +64,4 @@ # endif #endif -#ifndef __nonnull -# if __GNUC_PREREQ (3,3) -# define __nonnull(params) __attribute__ ((__nonnull__ params)) -# else -# define __nonnull(params) -# endif -#endif - #endif /* getopt_cdefs.h */ diff --git a/lib/getopt_core.h b/lib/getopt_core.h index 1744c29..76ef466 100644 --- a/lib/getopt_core.h +++ b/lib/getopt_core.h @@ -89,7 +89,7 @@ extern int optopt; writable. */ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) - __THROW __nonnull ((2, 3)); + __THROW _GL_ARG_NONNULL ((2, 3)); __END_DECLS diff --git a/lib/getopt_ext.h b/lib/getopt_ext.h index c1a58da..a3a6750 100644 --- a/lib/getopt_ext.h +++ b/lib/getopt_ext.h @@ -66,11 +66,11 @@ struct option extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) - __THROW __nonnull ((2, 3)); + __THROW _GL_ARG_NONNULL ((2, 3)); extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) - __THROW __nonnull ((2, 3)); + __THROW _GL_ARG_NONNULL ((2, 3)); __END_DECLS diff --git a/lib/unistd.in.h b/lib/unistd.in.h index 38a0f0a..de619dc 100644 --- a/lib/unistd.in.h +++ b/lib/unistd.in.h @@ -127,6 +127,13 @@ # include #endif +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* The definition of _GL_WARN_ON_USE is copied here. */ + + /* Get getopt(), optarg, optind, opterr, optopt. But avoid namespace pollution on glibc systems. */ #if @GNULIB_UNISTD_H_GETOPT@ && !defined __GLIBC__ && !defined _GL_SYSTEM_GETOPT @@ -142,13 +149,6 @@ _GL_INLINE_HEADER_BEGIN # define _GL_UNISTD_INLINE _GL_INLINE #endif -/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ - -/* The definition of _GL_ARG_NONNULL is copied here. */ - -/* The definition of _GL_WARN_ON_USE is copied here. */ - - /* Hide some function declarations from . */ #if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ diff --git a/modules/getopt-posix b/modules/getopt-posix index 5844217..2208756 100644 --- a/modules/getopt-posix +++ b/modules/getopt-posix @@ -18,6 +18,7 @@ unistd extensions include_next gettext-h [test $REPLACE_GETOPT = 1] +snippet/arg-nonnull configure.ac: gl_FUNC_GETOPT_POSIX @@ -43,6 +44,7 @@ getopt.h: getopt.in.h $(top_builddir)/config.status -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_GETOPT_H''@|$(NEXT_GETOPT_H)|g' \ + -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ < $(srcdir)/getopt.in.h; \ } > $@-t && \ mv -f $@-t $@ -- 2.7.4