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 <br...@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])