]> Savannah Git Hosting - gnulib.git/commitdiff
verify: Avoid syntax error due to static_assert with MSVC 14 in C++.
authorBruno Haible <bruno@clisp.org>
Wed, 14 Sep 2022 16:08:10 +0000 (18:08 +0200)
committerBruno Haible <bruno@clisp.org>
Wed, 14 Sep 2022 16:08:10 +0000 (18:08 +0200)
* lib/verify.h (static_assert): For MSVC in C++ mode, use a definition
that supports both the two-arguments and the one-argument syntax.

ChangeLog
lib/verify.h

index af34da6da7361252b298d3098f274c5cc316d8bb..9c26d25bd0580d6949ac5cc268c973c53fa29ced 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2022-09-14  Bruno Haible  <bruno@clisp.org>
+
+       verify: Avoid syntax error due to static_assert with MSVC 14 in C++.
+       * lib/verify.h (static_assert): For MSVC in C++ mode, use a definition
+       that supports both the two-arguments and the one-argument syntax.
+
 2022-09-14  Bruno Haible  <bruno@clisp.org>
 
        posix_spawn-* tests: Fix test failure on mingw when libtool is in use.
index a0d597f3d44c7786679ca05f07983f1c82b48031..0f5f0edc86bea0110986e1b3ea348b9e1b8c6b14 100644 (file)
@@ -229,7 +229,22 @@ template <int w>
 # if (!defined static_assert \
       && __STDC_VERSION__ < 202311 \
       && __cpp_static_assert < 201411 && __GNUG__ < 6)
-#  define static_assert _Static_assert /* C11 requires this #define.  */
+#  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.
+   We have to play preprocessor tricks to distinguish the two cases.
+   Since the MSVC preprocessor is not ISO C compliant (cf.
+   <https://stackoverflow.com/questions/5134523/>), the solution is specific
+   to MSVC.  */
+#   define _GL_EXPAND(x) x
+#   define _GL_SA1(a1) static_assert ((a1), "static assertion failed")
+#   define _GL_SA2 static_assert
+#   define _GL_SA3 static_assert
+#   define _GL_SA_PICK(x1,x2,x3,x4,...) x4
+#   define static_assert(...) _GL_EXPAND(_GL_SA_PICK(__VA_ARGS__,_GL_SA3,_GL_SA2,_GL_SA1)) (__VA_ARGS__)
+#  else
+#   define static_assert _Static_assert /* C11 requires this #define. */
+#  endif
 # endif
 #endif