diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2022-12-28 14:15:43 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2022-12-28 14:16:10 -0800 |
commit | 14a7b0ce5462c90ce86d97bf952185ec2500d341 (patch) | |
tree | 644da8e2776e0e60266e2a93db9a5e608ee62ebe /lib | |
parent | d65e5a8ba77595a598c9ddb8dfa09c4aea732659 (diff) | |
download | gnulib-14a7b0ce5462c90ce86d97bf952185ec2500d341.tar.gz |
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.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/verify.h | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/lib/verify.h b/lib/verify.h index 5225a8e616..cb635a9fc2 100644 --- a/lib/verify.h +++ b/lib/verify.h @@ -223,8 +223,15 @@ template <int w> /* _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 + <https://stackoverflow.com/questions/5134523/>. */ +# define _Static_assert(R, ...) \ + _GL_VERIFY ((R), "static assertion failed", -) +# endif # endif # if (!defined static_assert \ && __STDC_VERSION__ < 202311 \ @@ -235,9 +242,8 @@ template <int w> /* 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. */ + 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 |