From: Paul Eggert Date: Wed, 28 Dec 2022 22:15:43 +0000 (-0800) Subject: assert-h: port static_assert to strict C99 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=63c929959e40a8e64d216a68eb6ae88988f1a98b;p=gnulib.git assert-h: port static_assert to strict C99 * lib/verify.h (_GL_VERIFY): Port MSVC hack back to C99. Problem found when testing bleeding-edge gzip on IBM XL C for AIX, V12.1 (5765-J02, 5725-C72), which complained ‘"malloca.c", line 42.56: 1506-041 (E) The invocation of macro _Static_assert contains fewer arguments than are required by the macro definition.’ This diagnostic is valid because C99 requires that if you #define _Static_assert(R, ...) you must call _Static_assert with at least two arguments. I found a similar problem with Sun C 5.9 SunOS_sparc Patch 124867-12 2009/11/22. --- diff --git a/ChangeLog b/ChangeLog index a18e09acdb..540a6d7534 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2022-12-28 Paul Eggert + + assert-h: port static_assert to strict C99 + * lib/verify.h (_GL_VERIFY): Port MSVC hack back to C99. + Problem found when testing bleeding-edge gzip on IBM XL C for AIX, + V12.1 (5765-J02, 5725-C72), which complained ‘"malloca.c", line + 42.56: 1506-041 (E) The invocation of macro _Static_assert + contains fewer arguments than are required by the macro + definition.’ This diagnostic is valid because C99 requires + that if you #define _Static_assert(R, ...) you must call + _Static_assert with at least two arguments. I found a similar + problem with Sun C 5.9 SunOS_sparc Patch 124867-12 2009/11/22. + 2022-12-27 Bruno Haible Fix compilation errors in C++ mode on Solaris 11 OpenIndiana. diff --git a/lib/verify.h b/lib/verify.h index d440757b56..82ba51fd75 100644 --- a/lib/verify.h +++ b/lib/verify.h @@ -223,8 +223,15 @@ template /* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */ #ifdef _GL_STATIC_ASSERT_H # if !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert -# define _Static_assert(R, ...) \ - _GL_VERIFY ((R), "static assertion failed", -) +# if !defined _MSC_VER || defined __clang__ +# define _Static_assert(...) \ + _GL_VERIFY (__VA_ARGS__, "static assertion failed", -) +# else + /* Work around MSVC preprocessor incompatibility with ISO C; see + . */ +# define _Static_assert(R, ...) \ + _GL_VERIFY ((R), "static assertion failed", -) +# endif # endif # if (!defined static_assert \ && (!defined __cplusplus \ @@ -234,9 +241,8 @@ template /* 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. */ + Since the MSVC preprocessor is not ISO C compliant (see above),. + 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