]> git.ipfire.org Git - thirdparty/gnulib.git/commitdiff
stdcountof-h: Add support for C++ compilers that lack _Countof.
authorBruno Haible <bruno@clisp.org>
Mon, 8 Sep 2025 13:22:46 +0000 (15:22 +0200)
committerBruno Haible <bruno@clisp.org>
Mon, 8 Sep 2025 13:22:46 +0000 (15:22 +0200)
* lib/stdcountof.in.h: Use include_next idiom. In C++ mode, test
CXX_HAVE_STDCOUNTOF_H instead of HAVE_STDCOUNTOF_H.
* m4/stdcountof_h.m4 (gl_STDCOUNTOF_H): Invoke gl_CHECK_NEXT_HEADERS.
Set CXX_HAVE_STDCOUNTOF_H. Consider CXX_HAVE_STDCOUNTOF_H when setting
GL_GENERATE_STDCOUNTOF_H.
* modules/stdcountof-h (Depends-on): Add include_next.
(Makefile.am): Substitute GUARD_PREFIX, HAVE_STDCOUNTOF_H,
CXX_HAVE_STDCOUNTOF_H, INCLUDE_NEXT, PRAGMA_SYSTEM_HEADER,
PRAGMA_COLUMNS, NEXT_STDCOUNTOF_H.

ChangeLog
lib/stdcountof.in.h
m4/stdcountof_h.m4
modules/stdcountof-h

index c31b13b15c0f377920424a4e67b3ca5af0042d19..26fc6bb24c9113fd18150815482430815704cd71 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2025-09-08  Bruno Haible  <bruno@clisp.org>
+
+       stdcountof-h: Add support for C++ compilers that lack _Countof.
+       * lib/stdcountof.in.h: Use include_next idiom. In C++ mode, test
+       CXX_HAVE_STDCOUNTOF_H instead of HAVE_STDCOUNTOF_H.
+       * m4/stdcountof_h.m4 (gl_STDCOUNTOF_H): Invoke gl_CHECK_NEXT_HEADERS.
+       Set CXX_HAVE_STDCOUNTOF_H. Consider CXX_HAVE_STDCOUNTOF_H when setting
+       GL_GENERATE_STDCOUNTOF_H.
+       * modules/stdcountof-h (Depends-on): Add include_next.
+       (Makefile.am): Substitute GUARD_PREFIX, HAVE_STDCOUNTOF_H,
+       CXX_HAVE_STDCOUNTOF_H, INCLUDE_NEXT, PRAGMA_SYSTEM_HEADER,
+       PRAGMA_COLUMNS, NEXT_STDCOUNTOF_H.
+
 2025-09-08  Bruno Haible  <bruno@clisp.org>
 
        stdcountof-h tests: Fix compilation error with clang 21.
index d5def6bf57797dc5ce0c4eea184ce13d4f80ab4a..93c7f6bb75d84ec39354b13595dd2d2e226088e2 100644 (file)
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2025.  */
 
-#ifndef _GL_STDCOUNTOF_H
-#define _GL_STDCOUNTOF_H
+#ifndef _@GUARD_PREFIX@_STDCOUNTOF_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard.  */
+#if (defined __cplusplus ? @CXX_HAVE_STDCOUNTOF_H@ : @HAVE_STDCOUNTOF_H@)
+# @INCLUDE_NEXT@ @NEXT_STDCOUNTOF_H@
+#else
+
+#ifndef _@GUARD_PREFIX@_STDCOUNTOF_H
+#define _@GUARD_PREFIX@_STDCOUNTOF_H
 
 /* This file uses _GL_GNUC_PREREQ.  */
 #if !_GL_CONFIG_H_INCLUDED
@@ -96,4 +108,6 @@ template <typename T> _gl_array_type_test<T> _gl_array_type_test_helper(T&);
 # endif
 #endif
 
-#endif /* _GL_STDCOUNTOF_H */
+#endif /* _@GUARD_PREFIX@_STDCOUNTOF_H */
+#endif
+#endif /* _@GUARD_PREFIX@_STDCOUNTOF_H */
index 23b31c10fbc03087eaf4dfaea411690471312bb9..9fa27d24c862b036e2c9dcdcb29263a30e351349 100644 (file)
@@ -1,5 +1,5 @@
 # stdcountof_h.m4
-# serial 1
+# serial 2
 dnl Copyright 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,
@@ -9,6 +9,7 @@ dnl This file is offered as-is, without any warranty.
 AC_DEFUN_ONCE([gl_STDCOUNTOF_H],
 [
   AC_CHECK_HEADERS_ONCE([stdcountof.h])
+  gl_CHECK_NEXT_HEADERS([stdcountof.h])
   if test $ac_cv_header_stdcountof_h = yes; then
     HAVE_STDCOUNTOF_H=1
   else
@@ -16,7 +17,35 @@ AC_DEFUN_ONCE([gl_STDCOUNTOF_H],
   fi
   AC_SUBST([HAVE_STDCOUNTOF_H])
 
-  if test $HAVE_STDCOUNTOF_H = 1; then
+  dnl In clang 21, <stdcountof.h> exists but does not work in C++ mode, because
+  dnl it uses _Countof, which is not a compiler built-in in C++ mode.
+  m4_ifdef([gl_ANSI_CXX], [AC_REQUIRE([gl_ANSI_CXX])])
+  CXX_HAVE_STDCOUNTOF_H=1
+  if test "$CXX" != no; then
+    AC_CACHE_CHECK([whether the C++ compiler has <stdcountof.h>],
+      [gl_cv_cxx_have_stdcountof_h],
+      [dnl We can't use AC_LANG_PUSH([C++]) and AC_LANG_POP([C++]) here, due to
+       dnl an autoconf bug <https://savannah.gnu.org/support/?110294>.
+       cat > conftest.cpp <<\EOF
+#include <stdcountof.h>
+int a[] = { 86, 47 };
+unsigned int a_n = countof (a);
+EOF
+       gl_command="$CXX $CXXFLAGS $CPPFLAGS -c conftest.cpp"
+       if AC_TRY_EVAL([gl_command]); then
+         gl_cv_cxx_have_stdcountof_h=yes
+       else
+         gl_cv_cxx_have_stdcountof_h=no
+       fi
+       rm -fr conftest*
+      ])
+    if test $gl_cv_cxx_have_stdcountof_h != yes; then
+      CXX_HAVE_STDCOUNTOF_H=0
+    fi
+  fi
+  AC_SUBST([CXX_HAVE_STDCOUNTOF_H])
+
+  if test $HAVE_STDCOUNTOF_H = 1 && test $CXX_HAVE_STDCOUNTOF_H = 1; then
     GL_GENERATE_STDCOUNTOF_H=false
   else
     GL_GENERATE_STDCOUNTOF_H=true
index e8fa2775975e46a4898ce96351b3bf408a10cdf9..f39d963c7b098388d2c0214e0c880ada75eb670e 100644 (file)
@@ -7,6 +7,7 @@ m4/stdcountof_h.m4
 
 Depends-on:
 gen-header
+include_next
 
 configure.ac:
 gl_STDCOUNTOF_H
@@ -21,7 +22,15 @@ BUILT_SOURCES += $(STDCOUNTOF_H)
 if GL_GENERATE_STDCOUNTOF_H
 stdcountof.h: stdcountof.in.h $(top_builddir)/config.status
 @NMD@  $(AM_V_GEN)$(MKDIR_P) '%reldir%'
-       $(gl_V_at)$(SED_HEADER_STDOUT) $(srcdir)/stdcountof.in.h > $@-t
+       $(gl_V_at)$(SED_HEADER_STDOUT) \
+             -e 's|@''GUARD_PREFIX''@|${gl_include_guard_prefix}|g' \
+             -e 's/@''HAVE_STDCOUNTOF_H''@/$(HAVE_STDCOUNTOF_H)/g' \
+             -e 's/@''CXX_HAVE_STDCOUNTOF_H''@/$(CXX_HAVE_STDCOUNTOF_H)/g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_STDCOUNTOF_H''@|$(NEXT_STDCOUNTOF_H)|g' \
+             $(srcdir)/stdcountof.in.h > $@-t
        $(AM_V_at)mv $@-t $@
 else
 stdcountof.h: $(top_builddir)/config.status