From ab182c624868fcc0ed97597db669911099d4bd28 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 12 Jun 2016 10:31:25 -0700 Subject: [PATCH] New macro GNUC_PREREQ for GCC version MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * src/conf_post.h (GNUC_PREREQ): New macro. Change uses of __GNUC_MINOR__ and __GNUC_PATCHLEVEL__ to use this macro instead, for clarity and consistency. (PRINTF_ARCHETYPE): New macro. Define it to __gnu_printf__ only if glibc, since non-GNU platforms don’t necessarily support GNU printf formats. (ATTRIBUTE_FORMAT_PRINTF): Use it. --- src/bytecode.c | 4 ++-- src/conf_post.h | 49 +++++++++++++++++++++++++-------------------- src/emacsgtkfixed.c | 2 +- src/frame.h | 2 +- src/gmalloc.c | 2 +- src/lisp.h | 7 +++---- src/process.c | 4 ++-- 7 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/bytecode.c b/src/bytecode.c index fb9f617b51..c9e4a25dfa 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -637,7 +637,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, the table clearer. */ #define LABEL(OP) [OP] = &&insn_ ## OP -#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__) +#if GNUC_PREREQ (4, 6, 0) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Woverride-init" #elif defined __clang__ @@ -656,7 +656,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, #undef DEFINE }; -#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__) || defined __clang__ +#if GNUC_PREREQ (4, 6, 0) || defined __clang__ # pragma GCC diagnostic pop #endif diff --git a/src/conf_post.h b/src/conf_post.h index e21e73eb99..4459caf3f9 100644 --- a/src/conf_post.h +++ b/src/conf_post.h @@ -34,6 +34,17 @@ along with GNU Emacs. If not, see . */ #include +/* GNUC_PREREQ (V, W, X) is true if this is GNU C version V.W.X or later. + It can be used in a preprocessor expression. */ +#ifndef __GNUC_MINOR__ +# define GNUC_PREREQ(v, w, x) false +#elif ! defined __GNUC_PATCHLEVEL__ +# define GNUC_PREREQ(v, w, x) ((v) < __GNUC__ + ((w) <= __GNUC_MINOR__)) +#else +# define GNUC_PREREQ(v, w, x) \ + ((v) < __GNUC__ + ((w) <= __GNUC_MINOR__ + ((x) <= __GNUC_PATCHLEVEL__))) +#endif + /* The type of bool bitfields. Needed to compile Objective-C with standard GCC. It was also needed to port to pre-C99 compilers, although we don't care about that any more. */ @@ -55,13 +66,11 @@ typedef bool bool_bf; on arguments like alloc_size that are handled in this simulation. */ #ifndef __has_attribute # define __has_attribute(a) __has_attribute_##a -# define __has_attribute_alloc_size (4 < __GNUC__ + (3 <= __GNUC_MINOR__)) -# define __has_attribute_cleanup (3 < __GNUC__ + (4 <= __GNUC_MINOR__)) -# define __has_attribute_externally_visible \ - (4 < __GNUC__ + (1 <= __GNUC_MINOR__)) +# define __has_attribute_alloc_size GNUC_PREREQ (4, 3, 0) +# define __has_attribute_cleanup GNUC_PREREQ (3, 4, 0) +# define __has_attribute_externally_visible GNUC_PREREQ (4, 1, 0) # define __has_attribute_no_address_safety_analysis false -# define __has_attribute_no_sanitize_address \ - (4 < __GNUC__ + (8 <= __GNUC_MINOR__)) +# define __has_attribute_no_sanitize_address GNUC_PREREQ (4, 8, 0) #endif /* Simulate __has_builtin on compilers that lack it. It is used only @@ -69,8 +78,7 @@ typedef bool bool_bf; simulation. */ #ifndef __has_builtin # define __has_builtin(a) __has_builtin_##a -# define __has_builtin___builtin_assume_aligned \ - (4 < __GNUC__ + (7 <= __GNUC_MINOR__)) +# define __has_builtin___builtin_assume_aligned GNUC_PREREQ (4, 7, 0) #endif /* Simulate __has_feature on compilers that lack it. It is used only @@ -245,24 +253,21 @@ extern int emacs_setenv_TZ (char const *); #define EXTERNALLY_VISIBLE #endif -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) +#if GNUC_PREREQ (2, 7, 0) # define ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else # define ATTRIBUTE_FORMAT(spec) /* empty */ #endif -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) -# ifdef __MINGW32__ -# define ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \ - ATTRIBUTE_FORMAT ((__ms_printf__, formatstring_parameter, first_argument)) -#else /* !__MINGW32__ */ -# define ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \ - ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument)) -#endif /* !__MINGW32__ */ -#else /* __GNUC__ < 4.4 */ -# define ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \ - ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument)) -#endif /* __GNUC__ < 4.4 */ +#if GNUC_PREREQ (4, 4, 0) && defined __GLIBC_MINOR__ +# define PRINTF_ARCHETYPE __gnu_printf__ +#elif GNUC_PREREQ (4, 4, 0) && defined __MINGW32__ +# define PRINTF_ARCHETYPE __ms_printf__ +#else +# define PRINTF_ARCHETYPE __printf__ +#endif +#define ATTRIBUTE_FORMAT_PRINTF(string_index, first_to_check) \ + ATTRIBUTE_FORMAT ((PRINTF_ARCHETYPE, string_index, first_to_check)) #define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST #define ATTRIBUTE_UNUSED _GL_UNUSED @@ -286,7 +291,7 @@ extern int emacs_setenv_TZ (char const *); no_sanitize_address attribute. This bug is fixed in GCC 4.9.0 and clang 3.4. */ #if (! ADDRESS_SANITIZER \ - || ((4 < __GNUC__ + (9 <= __GNUC_MINOR__)) \ + || (GNUC_PREREQ (4, 9, 0) \ || 3 < __clang_major__ + (4 <= __clang_minor__))) # define ADDRESS_SANITIZER_WORKAROUND /* No workaround needed. */ #else diff --git a/src/emacsgtkfixed.c b/src/emacsgtkfixed.c index ca0bbfbb86..c04adf28b3 100644 --- a/src/emacsgtkfixed.c +++ b/src/emacsgtkfixed.c @@ -27,7 +27,7 @@ along with GNU Emacs. If not, see . */ #include "emacsgtkfixed.h" /* Silence a bogus diagnostic; see GNOME bug 683906. */ -#if 4 < __GNUC__ + (7 <= __GNUC_MINOR__) && ! GLIB_CHECK_VERSION (2, 35, 7) +#if GNUC_PREREQ (4, 7, 0) && ! GLIB_CHECK_VERSION (2, 35, 7) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wunused-local-typedefs" #endif diff --git a/src/frame.h b/src/frame.h index 9de672c863..7d64e00b42 100644 --- a/src/frame.h +++ b/src/frame.h @@ -1470,7 +1470,7 @@ INLINE_HEADER_END /* Suppress -Wsuggest-attribute=const if there are no scroll bars. This is for functions like x_set_horizontal_scroll_bars that have no effect in this case. */ -#if ! USE_HORIZONTAL_SCROLL_BARS && 4 < __GNUC__ + (6 <= __GNUC_MINOR__) +#if ! USE_HORIZONTAL_SCROLL_BARS && GNUC_PREREQ (4, 6, 0) # pragma GCC diagnostic ignored "-Wsuggest-attribute=const" #endif diff --git a/src/gmalloc.c b/src/gmalloc.c index d795c13f61..483d05c5c6 100644 --- a/src/gmalloc.c +++ b/src/gmalloc.c @@ -44,7 +44,7 @@ License along with this library. If not, see . #endif #ifdef HAVE_MALLOC_H -# if 4 < __GNUC__ + (2 <= __GNUC_MINOR__) +# if GNUC_PREREQ (4, 2, 0) # pragma GCC diagnostic ignored "-Wdeprecated-declarations" # endif # include diff --git a/src/lisp.h b/src/lisp.h index a0d0610a18..972ca33511 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -4172,8 +4172,8 @@ extern void kill_buffer_processes (Lisp_Object); extern int wait_reading_process_output (intmax_t, int, int, bool, Lisp_Object, struct Lisp_Process *, int); /* Max value for the first argument of wait_reading_process_output. */ -#if __GNUC__ == 3 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 5) -/* Work around a bug in GCC 3.4.2, known to be fixed in GCC 4.6.3. +#if GNUC_PREREQ (3, 0, 0) && ! GNUC_PREREQ (4, 6, 0) +/* Work around a bug in GCC 3.4.2, known to be fixed in GCC 4.6.0. The bug merely causes a bogus warning, but the warning is annoying. */ # define WAIT_READING_MAX min (TYPE_MAXIMUM (time_t), INTMAX_MAX) #else @@ -4546,8 +4546,7 @@ extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1)); Build with CPPFLAGS='-DUSE_STACK_LISP_OBJECTS=0' to disable it. */ #if (!defined USE_STACK_LISP_OBJECTS \ - && defined __GNUC__ && !defined __clang__ \ - && !(4 < __GNUC__ + (3 < __GNUC_MINOR__ + (2 <= __GNUC_PATCHLEVEL__)))) + && defined __GNUC__ && !defined __clang__ && ! GNUC_PREREQ (4, 3, 2)) /* Work around GCC bugs 36584 and 35271, which were fixed in GCC 4.3.2. */ # define USE_STACK_LISP_OBJECTS false #endif diff --git a/src/process.c b/src/process.c index 4d287d8cc5..e669278f6e 100644 --- a/src/process.c +++ b/src/process.c @@ -130,10 +130,10 @@ extern int sys_select (int, fd_set *, fd_set *, fd_set *, struct timespec *, void *); #endif -/* Work around GCC 4.7.0 bug with strict overflow checking; see +/* Work around GCC 4.3.0 bug with strict overflow checking; see . This bug appears to be fixed in GCC 5.1, so don't work around it there. */ -#if __GNUC__ == 4 && __GNUC_MINOR__ >= 3 +#if GNUC_PREREQ (4, 3, 0) && ! GNUC_PREREQ (5, 1, 0) # pragma GCC diagnostic ignored "-Wstrict-overflow" #endif -- 2.39.2