Paul Eggert wrote:
> +2025-06-27  Paul Eggert  <egg...@cs.ucla.edu>
> +
> +     _Noreturn: pacify gcc -std=gnu99 -Wpedantic
> +     Problem reported by Helmut Eller <https://bugs.gnu.org/78903>.
> +     * lib/_Noreturn.h (_Noreturn):
> +     * m4/gnulib-common.m4 (gl_COMMON_BODY): Prefer __attribute__
> +     ((__noreturn__)) to _Noreturn if __STDC_VERSION__ < 201112, to
> +     pacify gcc -std=gnu99 -Wpedantic.  Simplify.  Do not bother
> +     suggesting -D_GL_WORK_AROUND_LLVM_BUG_59792; suggest the
> +     equivalent -D_Noreturn= instead, and remove the test on
> +     _GL_WORK_AROUND_LLVM_BUG_59792.

The "Simplify." part of this change caused a regression. Fortunately
caught by the weekly CI. Namely, a compilation error on Solaris.

On Solaris 11.4:

g++ -m64 -DHAVE_CONFIG_H -DEXEEXT=\"\" -DEXEEXT=\"\" -I. -I../../gltests -I..   
-DGNULIB_STRICT_CHECKING=1  -DIN_GNULIB_TESTS=1  -I. -I../../gltests  -I.. 
-I../../gltests/..  -I../gllib -I../../gltests/../gllib -I/root/include -Wall 
-DCONTINUE_AFTER_ASSERT -D_REENTRANT  -Wno-error -g -O2 -MT test-assert-h-c++.o 
-MD -MP -MF $depbase.Tpo -c -o test-assert-h-c++.o 
../../gltests/test-assert-h-c++.cc &&\
mv -f $depbase.Tpo $depbase.Po
In file included from /usr/include/sys/time.h:462,
                 from ../gllib/sys/time.h:46,
                 from /usr/include/sys/select.h:27,
                 from ../gllib/sys/select.h:43,
                 from /usr/include/sys/types.h:667,
                 from ../gllib/sys/types.h:46,
                 from ../gllib/stdio.h:83,
                 from /usr/include/iso/wchar_iso.h:32,
                 from 
/usr/gcc/14/lib/gcc/x86_64-pc-solaris2.11/14.2.0/include-fixed/wchar.h:18,
                 from ../gllib/wchar.h:83,
                 from /usr/gcc/14/include/c++/14.2.0/cwchar:44,
                 from /usr/gcc/14/include/c++/14.2.0/bits/postypes.h:40,
                 from /usr/gcc/14/include/c++/14.2.0/iosfwd:42,
                 from /usr/gcc/14/include/c++/14.2.0/ios:40,
                 from /usr/gcc/14/include/c++/14.2.0/ostream:40,
                 from /usr/gcc/14/include/c++/14.2.0/iostream:41,
                 from ../../gltests/test-assert-h-c++.cc:26:
../gllib/stdlib.h:866:1: error: ‘_Noreturn’ does not name a type
  866 | _GL_FUNCDECL_RPL (abort, _Noreturn void, (void), );
      | ^~~~~~~~~~~~~~~~
../gllib/stdlib.h: In member function ‘gnulib::_gl_abort_wrapper::operator 
type() const’:
../gllib/stdlib.h:867:1: error: ‘::rpl_abort’ has not been declared
  867 | _GL_CXXALIAS_RPL (abort, void, (void));
      | ^~~~~~~~~~~~~~~~
*** Error code 1

On Solaris 11 OmniOS:

g++ -DHAVE_CONFIG_H -DEXEEXT=\"\" -DEXEEXT=\"\" -I. -I../../gltests -I..  
-DGNULIB_STRICT_CHECKING=1 -DIN_GNULIB_TESTS=1 -I. -I../../gltests -I.. 
-I../../gltests/.. -I../gllib -I../../gltests/../gllib -I/root/include -Wall 
-DCONTINUE_AFTER_ASSERT -D_REENTRANT  -Wno-error -g -O2 -MT test-assert-h-c++.o 
-MD -MP -MF $depbase.Tpo -c -o test-assert-h-c++.o 
../../gltests/test-assert-h-c++.cc &&\
mv -f $depbase.Tpo $depbase.Po
In file included from /usr/include/sys/time.h:489,
                 from ../gllib/sys/time.h:46,
                 from /usr/include/sys/select.h:53,
                 from ../gllib/sys/select.h:43,
                 from /usr/include/sys/types.h:672,
                 from ../gllib/sys/types.h:46,
                 from ../gllib/stdio.h:83,
                 from /usr/include/iso/wchar_iso.h:54,
                 from 
/opt/gcc-14/lib/gcc/x86_64-pc-solaris2.11/14.2.0/include-fixed/wchar.h:40,
                 from ../gllib/wchar.h:83,
                 from /opt/gcc-14/include/c++/14.2.0/cwchar:44,
                 from /opt/gcc-14/include/c++/14.2.0/bits/postypes.h:40,
                 from /opt/gcc-14/include/c++/14.2.0/iosfwd:42,
                 from /opt/gcc-14/include/c++/14.2.0/ios:40,
                 from /opt/gcc-14/include/c++/14.2.0/ostream:40,
                 from /opt/gcc-14/include/c++/14.2.0/iostream:41,
                 from ../../gltests/test-assert-h-c++.cc:26:
../gllib/stdlib.h:866:1: error: '_Noreturn' does not name a type
  866 | _GL_FUNCDECL_RPL (abort, _Noreturn void, (void), );
      | ^~~~~~~~~~~~~~~~
../gllib/stdlib.h: In member function 'gnulib::_gl_abort_wrapper::operator 
type() const':
../gllib/stdlib.h:867:1: error: '::rpl_abort' has not been declared
  867 | _GL_CXXALIAS_RPL (abort, void, (void));
      | ^~~~~~~~~~~~~~~~
gmake[4]: *** [Makefile:27318: test-assert-h-c++.o] Error 1

This patch fixes it.

Was there any reason to remove the
  '(!defined __cplusplus || defined __clang__) && '
part of the condition?


2025-06-30  Bruno Haible  <br...@clisp.org>

        _Noreturn: Fix compilation in C++ mode on Solaris (regr. 2025-06-27).
        * lib/_Noreturn.h (_Noreturn): Restore C++ mode handling.
        * m4/gnulib-common.m4 (gl_COMMON_BODY): Likewise.

diff --git a/lib/_Noreturn.h b/lib/_Noreturn.h
index 8e63387914..d42f15eee6 100644
--- a/lib/_Noreturn.h
+++ b/lib/_Noreturn.h
@@ -27,7 +27,8 @@
    This rare bug can be worked around by compiling with 'clang -D_Noreturn=',
    though the workaround may generate many false-alarm warnings.  */
 #ifndef _Noreturn
-# if 201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)
+# if ((!defined __cplusplus || defined __clang__) \
+      && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)))
    /* _Noreturn works as-is.  */
 # elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
         || 0x5110 <= __SUNPRO_C)
diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4
index d525d8b1fa..034dae69e6 100644
--- a/m4/gnulib-common.m4
+++ b/m4/gnulib-common.m4
@@ -1,5 +1,5 @@
 # gnulib-common.m4
-# serial 112
+# serial 113
 dnl Copyright (C) 2007-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,
@@ -70,7 +70,8 @@ AC_DEFUN([gl_COMMON_BODY]
    This rare bug can be worked around by compiling with 'clang -D_Noreturn=',
    though the workaround may generate many false-alarm warnings.  */
 #ifndef _Noreturn
-# if 201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)
+# if ((!defined __cplusplus || defined __clang__) \
+      && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)))
    /* _Noreturn works as-is.  */
 # elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
    /* Prefer __attribute__ ((__noreturn__)) to plain _Noreturn even if the




Reply via email to