bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PROPOSED 2/2] assert-h: prefer to ‘verify’


From: Bruno Haible
Subject: Re: [PROPOSED 2/2] assert-h: prefer to ‘verify’
Date: Wed, 14 Sep 2022 22:22:06 +0200

Paul Eggert wrote:
> Where it’s easy, prefer ‘static_assert’ to ‘verify’,

In a build of GNU gettext, with clang and the MSVC header files, I get errors
starting like this:

/bin/sh ./libtool  --tag=CXX   --mode=compile /home/bruno/msvc/compile clang-cl 
-ferror-limit=0 -DIN_LIBASPRINTF -DHAVE_CONFIG_H -D__USE_MINGW_ANSI_STDIO=0 -I. 
-I../../../gettext-runtime/libasprintf  -Ignulib-lib 
-I../../../gettext-runtime/libasprintf/gnulib-lib 
-D_WIN32_WINNT=_WIN32_WINNT_WIN7 -I/usr/local/msvcclang64/include -Wall 
-Wno-extra-semi-stmt -Wno-unused-function -Wno-inconsistent-dllimport 
-Wno-reserved-id-macro -Wno-undef -Wno-missing-field-initializers 
-Wno-unused-parameter -Wno-gnu-include-next -Wno-implicit-int-conversion 
-Wno-sign-compare -Wno-sign-conversion -Wno-comma -Wno-unused-macros 
-Wno-nonportable-system-include-path -Wno-format-nonliteral 
-Wno-deprecated-declarations -Wno-tautological-unsigned-zero-compare 
-Wno-used-but-marked-unused -Wno-parentheses-equality  -MD -O2 -c -o 
autosprintf.lo ../../../gettext-runtime/libasprintf/autosprintf.cc
libtool: compile:  /home/bruno/msvc/compile clang-cl -ferror-limit=0 
-DIN_LIBASPRINTF -DHAVE_CONFIG_H -D__USE_MINGW_ANSI_STDIO=0 -I. 
-I../../../gettext-runtime/libasprintf -Ignulib-lib 
-I../../../gettext-runtime/libasprintf/gnulib-lib 
-D_WIN32_WINNT=_WIN32_WINNT_WIN7 -I/usr/local/msvcclang64/include -Wall 
-Wno-extra-semi-stmt -Wno-unused-function -Wno-inconsistent-dllimport 
-Wno-reserved-id-macro -Wno-undef -Wno-missing-field-initializers 
-Wno-unused-parameter -Wno-gnu-include-next -Wno-implicit-int-conversion 
-Wno-sign-compare -Wno-sign-conversion -Wno-comma -Wno-unused-macros 
-Wno-nonportable-system-include-path -Wno-format-nonliteral 
-Wno-deprecated-declarations -Wno-tautological-unsigned-zero-compare 
-Wno-used-but-marked-unused -Wno-parentheses-equality -MD -O2 -c 
../../../gettext-runtime/libasprintf/autosprintf.cc -o autosprintf.obj
In file included from ../../../gettext-runtime/libasprintf/autosprintf.cc:18:
In file included from .\config.h:1098:
gnulib-lib\assert.h(239,43): warning: variadic macros are incompatible with 
C++98 [-Wc++98-compat-pedantic]
# define _GL_STATIC_ASSERT(R, DIAGNOSTIC, ...) static_assert (R, DIAGNOSTIC)
                                          ^
gnulib-lib\assert.h(254,29): warning: variadic macros are incompatible with 
C++98 [-Wc++98-compat-pedantic]
#  define _Static_assert(R, ...) \
                            ^
gnulib-lib\assert.h(274,12): warning: keyword is hidden by macro definition 
[-Wkeyword-macro]
#   define static_assert _Static_assert /* C11 requires this #define. */
           ^
In file included from ../../../gettext-runtime/libasprintf/autosprintf.cc:21:
In file included from .\autosprintf.h:35:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\include\string:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\include\istream:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\include\ostream:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\include\ios:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\include\xlocnum:6:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\include\climits:5:
In file included from C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\include\yvals.h:7:
C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC\include\xkeycheck.h(250,5): error: The C++ Standard Library forbids 
macroizing keywords. Enable warning C4005 to find the forbidden macro.
   #error The C++ Standard Library forbids macroizing keywords. Enable warning 
C4005 to find the forbidden macro.
    ^

This patch fixes it. Similarly to what we did with g++ 6.


2022-09-14  Bruno Haible  <bruno@clisp.org>

        verify: Avoid syntax error due to static_assert with clang in C++ mode.
        * lib/verify.h (static_assert): Don't define in clang C++ 6 or newer.
        * m4/assert_h.m4 (gl_ASSERT_H): If we don't need to define static_assert
        with clang in C++ mode, don't include <assert.h>.

diff --git a/lib/verify.h b/lib/verify.h
index 0f5f0edc86..99af802993 100644
--- a/lib/verify.h
+++ b/lib/verify.h
@@ -228,7 +228,9 @@ template <int w>
 # endif
 # if (!defined static_assert \
       && __STDC_VERSION__ < 202311 \
-      && __cpp_static_assert < 201411 && __GNUG__ < 6)
+      && (!defined __cplusplus \
+          || (__cpp_static_assert < 201411 \
+              && __GNUG__ < 6 && __clang_major__ < 6)))
 #  if defined __cplusplus && _MSC_VER >= 1900 && !defined __clang__
 /* MSVC 14 in C++ mode supports the two-arguments static_assert but not
    the one-argument static_assert, and it does not support _Static_assert.
diff --git a/m4/assert_h.m4 b/m4/assert_h.m4
index 43937869ec..d61572113c 100644
--- a/m4/assert_h.m4
+++ b/m4/assert_h.m4
@@ -48,7 +48,9 @@ AC_DEFUN([gl_ASSERT_H],
   dnl so that 'configure' does not comment it out.
   AH_VERBATIM([zzstatic_assert],
 [#if (!defined HAVE_C_STATIC_ASSERT && !defined assert \
-     && __cpp_static_assert < 201411 && __GNUG__ < 6)
+     && (!defined __cplusplus \
+         || (__cpp_static_assert < 201411 \
+             && __GNUG__ < 6 && __clang_major__ < 6)))
  #include <assert.h>
  #undef/**/assert
 #endif])






reply via email to

[Prev in Thread] Current Thread [Next in Thread]