[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])