On 1/14/22 03:33, Olivier Cessenat wrote:
"diffutils-3.8/lib/malloca.c", line 52: error: 64 bits operations with signed and unsigned operands are currently unsupported by __builtin_add_overflow

Thanks for the bug report. Although nvc 22.1 defines __GNUC__ to be 11 which means it supports GNU C as of GCC 11, that's obviously untrue for __builtin_add_overflow. That's unfortunate. Perhaps you could report this as a bug to NVIDIA, as their compiler shouldn't claim to support GNU C features that it lacks. nvc can set __GNUC__ to be the version of GNU C that it actually does support.

To work around the bug I installed the attached into Gnulib and this should appear in the next diffutils release. In the meantime you can compile with gcc.
From f0b5cdf9a1fdb5c991cf3e1bdffb55e31126dffc Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Fri, 14 Jan 2022 18:50:48 -0800
Subject: [PATCH] intprops: work around nvc 22.1 bug
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Problem reported by Olivier Cessenat (Bug#53256).
* lib/intprops.h (_GL_HAS_BUILTIN_ADD_OVERFLOW) [__EDG__]:
Define to 0, since __builtin_add_overflow doesn’t work
on NVIDIA HPC SDK 22.1.
---
 ChangeLog      | 6 ++++++
 lib/intprops.h | 8 ++++++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a900fec78d..cf22140d44 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2022-01-14  Paul Eggert  <egg...@cs.ucla.edu>
 
+	intprops: work around nvc 22.1 bug
+	Problem reported by Olivier Cessenat (Bug#53256).
+	* lib/intprops.h (_GL_HAS_BUILTIN_ADD_OVERFLOW) [__EDG__]:
+	Define to 0, since __builtin_add_overflow doesn’t work
+	on NVIDIA HPC SDK 22.1.
+
 	copy-file-range: work around Linux kernel bug
 	This workaround is adapted from Coreutils.
 	* lib/copy-file-range.c [__linux__ && HAVE_COPY_FILE_RANGE]:
diff --git a/lib/intprops.h b/lib/intprops.h
index 68d6daa570..d4a917f72a 100644
--- a/lib/intprops.h
+++ b/lib/intprops.h
@@ -229,11 +229,15 @@
 
 /* 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
+#ifdef __EDG__
+/* EDG-based compilers like nvc 22.1 cannot add 64-bit signed to unsigned
+   <https://bugs.gnu.org/53256>.  */
+# define _GL_HAS_BUILTIN_ADD_OVERFLOW 0
+#elif 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>.  */
-#elif 7 <= __GNUC__ && !defined __EDG__
+#elif 7 <= __GNUC__
 # define _GL_HAS_BUILTIN_ADD_OVERFLOW 1
 #else
 # define _GL_HAS_BUILTIN_ADD_OVERFLOW 0
-- 
2.32.0

Reply via email to