From 8be21b0a68da9a9527d9fab37c9a3acda819eb29 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Wed, 14 Sep 2022 18:08:10 +0200 Subject: [PATCH] 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. --- ChangeLog | 6 ++++++ lib/verify.h | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index af34da6da7..9c26d25bd0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2022-09-14 Bruno Haible + + 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 posix_spawn-* tests: Fix test failure on mingw when libtool is in use. diff --git a/lib/verify.h b/lib/verify.h index a0d597f3d4..0f5f0edc86 100644 --- a/lib/verify.h +++ b/lib/verify.h @@ -229,7 +229,22 @@ template # 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. + ), 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 -- 2.39.5