emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master ab182c6: New macro GNUC_PREREQ for GCC version


From: Paul Eggert
Subject: [Emacs-diffs] master ab182c6: New macro GNUC_PREREQ for GCC version
Date: Sun, 12 Jun 2016 17:33:56 +0000 (UTC)

branch: master
commit ab182c624868fcc0ed97597db669911099d4bd28
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    New macro GNUC_PREREQ for GCC version
    
    * 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 fb9f617..c9e4a25 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 e21e73e..4459caf 100644
--- a/src/conf_post.h
+++ b/src/conf_post.h
@@ -34,6 +34,17 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 
 #include <stdbool.h>
 
+/* 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 ca0bbfb..c04adf2 100644
--- a/src/emacsgtkfixed.c
+++ b/src/emacsgtkfixed.c
@@ -27,7 +27,7 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 #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 9de672c..7d64e00 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 d795c13..483d05c 100644
--- a/src/gmalloc.c
+++ b/src/gmalloc.c
@@ -44,7 +44,7 @@ License along with this library.  If not, see 
<http://www.gnu.org/licenses/>.
 #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 <malloc.h>
diff --git a/src/lisp.h b/src/lisp.h
index a0d0610..972ca33 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 4d287d8..e669278 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
    <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52904>.
    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
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]