In a testdir of fts and the GCC 15 warnings from HACKING I see:
$ cat ../output.txt
CC fts.o
In file included from /usr/include/features.h:524,
from /usr/include/sys/types.h:25,
from ./sys/types.h:46,
from fts_.h:80,
from fts.c:53:
/usr/include/sys/cdefs.h:79:11: warning: '__THROW' redefined
79 | # define __THROW __attribute__ ((__nothrow__ __LEAF))
| ^~~~~~~
fts_.h:67:11: note: this is the location of the previous definition
67 | # define __THROW
| ^~~~~~~
This is because fts_.h checks and undefines __THROW before <sys/cdefs.h>
is included in fts.c.
I have pushed the attached patch which fixes that and defines the macros
correctly like in getopt-cdefs.in.h as opposed to just undefining them.
Collin
>From 4cfd636f65174efdecfe01b864878c1502b21640 Mon Sep 17 00:00:00 2001
From: Collin Funk <[email protected]>
Date: Sat, 10 May 2025 16:07:57 -0700
Subject: [PATCH] fts: Fix redefinition of __THROW.
* lib/fts_.h: Include <sys/cdefs.h> if the system has it.
(__THROW, __BEGIN_DECLS, __END_DECLS): Define properly if not previously
defined.
* m4/fts.m4 (gl_FUNC_FTS_CORE): Check for sys/cdefs.h.
---
ChangeLog | 8 ++++++++
lib/fts_.h | 37 +++++++++++++++++++++++++++----------
m4/fts.m4 | 3 ++-
3 files changed, 37 insertions(+), 11 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 2d7696a717..6c248f533a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2025-05-10 Collin Funk <[email protected]>
+
+ fts: Fix redefinition of __THROW.
+ * lib/fts_.h: Include <sys/cdefs.h> if the system has it.
+ (__THROW, __BEGIN_DECLS, __END_DECLS): Define properly if not previously
+ defined.
+ * m4/fts.m4 (gl_FUNC_FTS_CORE): Check for sys/cdefs.h.
+
2025-05-10 Bruno Haible <[email protected]>
string-desc, xstring-desc: Avoid GCC attributes in function definitions.
diff --git a/lib/fts_.h b/lib/fts_.h
index 9fb4c62df9..052858da7b 100644
--- a/lib/fts_.h
+++ b/lib/fts_.h
@@ -62,17 +62,34 @@
# define __FLEXIBLE_ARRAY_MEMBER
# endif
# else
+# if HAVE_SYS_CDEFS_H
+# include <sys/cdefs.h>
+# endif
# define __FLEXIBLE_ARRAY_MEMBER FLEXIBLE_ARRAY_MEMBER
-# undef __THROW
-# define __THROW
-# undef __BEGIN_DECLS
-# undef __END_DECLS
-# ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# define __END_DECLS }
-# else
-# define __BEGIN_DECLS
-# define __END_DECLS
+# ifndef __THROW
+# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major__ >= 4)
+# if __cplusplus >= 201103L
+# define __THROW noexcept (true)
+# else
+# define __THROW throw ()
+# endif
+# else
+# define __THROW
+# endif
+# endif
+# ifndef __BEGIN_DECLS
+# ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# else
+# define __BEGIN_DECLS /* nothing */
+# endif
+# endif
+# ifndef __END_DECLS
+# ifdef __cplusplus
+# define __END_DECLS }
+# else
+# define __END_DECLS /* nothing */
+# endif
# endif
# endif
diff --git a/m4/fts.m4 b/m4/fts.m4
index 1c230bb93f..1d3a32f52e 100644
--- a/m4/fts.m4
+++ b/m4/fts.m4
@@ -1,5 +1,5 @@
# fts.m4
-# serial 24
+# serial 25
dnl Copyright (C) 2005-2025 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -15,6 +15,7 @@ AC_DEFUN([gl_FUNC_FTS_CORE]
[
dnl Prerequisites of lib/fts.c.
gl_FUNC_OPENAT
+ AC_CHECK_HEADERS_ONCE([sys/cdefs.h])
AC_CHECK_FUNCS_ONCE([fstatfs])
AC_CHECK_HEADERS_ONCE([sys/param.h sys/vfs.h])dnl
--
2.49.0