diff options
author | Ivan Shapovalov <intelfx@intelfx.name> | 2023-03-12 20:08:40 +0400 |
---|---|---|
committer | BenBE <BenBE@geshi.org> | 2023-04-23 16:00:17 +0200 |
commit | 1b640dff5759d73458204c87e217dab8759badd9 (patch) | |
tree | 860d2dea7e1c204a7c339337ca28fad4bce24d7b /Compat.h | |
parent | ed7eac5dfe8239f7942102f9d1a4f9ef5210f4d7 (diff) |
Compat: implement static_assert() shim for pre-C11
Diffstat (limited to 'Compat.h')
-rw-r--r-- | Compat.h | 23 |
1 files changed, 23 insertions, 0 deletions
@@ -9,6 +9,7 @@ in the source distribution for its full text. #include "config.h" // IWYU pragma: keep +#include <assert.h> // IWYU pragma: keep #include <fcntl.h> #include <stddef.h> #include <unistd.h> @@ -61,4 +62,26 @@ ssize_t Compat_readlink(openat_arg_t dirfd, char* buf, size_t bufsize); +/* + * static_assert() hack for pre-C11 + * TODO: drop after moving to -std=c11 or newer + */ + +/* C11 guarantees _Static_assert is a keyword */ +#if (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112L +# if !defined(_Static_assert) +# define _Static_assert(expr, msg) \ + extern int (*__Static_assert_function (void)) \ + [!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })] +# endif +#endif + +/* C23 will guarantee static_assert is a keyword or a macro */ +/* FIXME: replace 202300L with proper value once C23 is published */ +#if (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 202300L +# if !defined(static_assert) +# define static_assert(expr, msg) _Static_assert(expr, msg) +# endif +#endif + #endif /* HEADER_Compat */ |