]> Savannah Git Hosting - gnulib.git/commitdiff
intprops: streamline and get ready for Clang 14
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 6 Dec 2021 18:29:54 +0000 (10:29 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 6 Dec 2021 18:30:25 +0000 (10:30 -0800)
* lib/intprops.h (_GL_HAS_BUILTIN_ADD_OVERFLOW):
Rely on __has_builtin first, since GCC didn’t introduce it until
GCC 9 so we don’t need to special-case GCC first.
(_GL_HAS_BUILTIN_ADD_OVERFLOW, _GL_HAS_BUILTIN_OVERFLOW_P):
Look at __EDG__ rather than __ICC, since icc defines __EDG__ too.
(_GL_HAS_BUILTIN_MUL_OVERFLOW): Define to 1 in Clang 14 and later,
as a bug fix is scheduled for Clang 14.
(_GL_HAS_BUILTIN_OVERFLOW_P): Do not bother to special-case
__clang__, since __has_builtin should do the right thing anyway.

ChangeLog
lib/intprops.h

index 52068d2aa751d1f390df265a2c96741d748320f8..105918b2bbdf25add4eb3619beb8b64a2a47ac4b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2021-12-06  Paul Eggert  <eggert@cs.ucla.edu>
+
+       intprops: streamline and get ready for Clang 14
+       * lib/intprops.h (_GL_HAS_BUILTIN_ADD_OVERFLOW):
+       Rely on __has_builtin first, since GCC didn’t introduce it until
+       GCC 9 so we don’t need to special-case GCC first.
+       (_GL_HAS_BUILTIN_ADD_OVERFLOW, _GL_HAS_BUILTIN_OVERFLOW_P):
+       Look at __EDG__ rather than __ICC, since icc defines __EDG__ too.
+       (_GL_HAS_BUILTIN_MUL_OVERFLOW): Define to 1 in Clang 14 and later,
+       as a bug fix is scheduled for Clang 14.
+       (_GL_HAS_BUILTIN_OVERFLOW_P): Do not bother to special-case
+       __clang__, since __has_builtin should do the right thing anyway.
+
 2021-12-06  Bruno Haible  <bruno@clisp.org>
 
        intprops: Treat EDG-based compilers like Intel compilers.
index b36e0bbed97d22262d0d664b7ec757bc12586028..7f20f09fa06318835f651875107841d4b3c8fbcc 100644 (file)
 
 /* True if __builtin_add_overflow (A, B, P) and __builtin_sub_overflow
    (A, B, P) work when P is non-null.  */
+#if defined __has_builtin
+# define _GL_HAS_BUILTIN_ADD_OVERFLOW __has_builtin (__builtin_add_overflow)
 /* __builtin_{add,sub}_overflow exists but is not reliable in GCC 5.x and 6.x,
    see <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98269>.  */
-#if 7 <= __GNUC__ && !defined __ICC
+#elif 7 <= __GNUC__ && !defined __EDG__
 # define _GL_HAS_BUILTIN_ADD_OVERFLOW 1
-#elif defined __has_builtin
-# define _GL_HAS_BUILTIN_ADD_OVERFLOW __has_builtin (__builtin_add_overflow)
 #else
 # define _GL_HAS_BUILTIN_ADD_OVERFLOW 0
 #endif
 
 /* True if __builtin_mul_overflow (A, B, P) works when P is non-null.  */
-#ifdef __clang__
+#if defined __clang_major_ && __clang_major__ < 14
 /* Work around Clang bug <https://bugs.llvm.org/show_bug.cgi?id=16404>.  */
 # define _GL_HAS_BUILTIN_MUL_OVERFLOW 0
 #else
 
 /* True if __builtin_add_overflow_p (A, B, C) works, and similarly for
    __builtin_sub_overflow_p and __builtin_mul_overflow_p.  */
-#if defined __clang__ || defined __ICC || defined __EDG__
-/* Clang 11 lacks __builtin_mul_overflow_p, and even if it did it
-   would presumably run afoul of Clang bug 16404.  In ICC 2021.1 and
-   the EDG-based MCST Elbrus LCC compiler, __builtin_add_overflow_p etc.
-   are not treated as integral constant expressions even when all
-   arguments are.  */
+#ifdef __EDG__
+/* In EDG-based compilers like ICC 2021.3 and earlier,
+   __builtin_add_overflow_p etc. are not treated as integral constant
+   expressions even when all arguments are.  */
 # define _GL_HAS_BUILTIN_OVERFLOW_P 0
 #elif defined __has_builtin
 # define _GL_HAS_BUILTIN_OVERFLOW_P __has_builtin (__builtin_mul_overflow_p)
 #if _GL_HAS_BUILTIN_MUL_OVERFLOW
 # if ((9 < __GNUC__ + (3 <= __GNUC_MINOR__) \
        || (__GNUC__ == 8 && 4 <= __GNUC_MINOR__)) \
-      && !defined __ICC)
+      && !defined __EDG__)
 #  define INT_MULTIPLY_WRAPV(a, b, r) __builtin_mul_overflow (a, b, r)
 # else
    /* Work around GCC bug 91450.  */