diff options
Diffstat (limited to 'gl/verify.h')
| -rw-r--r-- | gl/verify.h | 65 |
1 files changed, 45 insertions, 20 deletions
diff --git a/gl/verify.h b/gl/verify.h index b63cb264..08268c24 100644 --- a/gl/verify.h +++ b/gl/verify.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* Compile-time assert-like macros. | 1 | /* Compile-time assert-like macros. |
| 2 | 2 | ||
| 3 | Copyright (C) 2005-2006, 2009-2023 Free Software Foundation, Inc. | 3 | Copyright (C) 2005-2006, 2009-2024 Free Software Foundation, Inc. |
| 4 | 4 | ||
| 5 | This file is free software: you can redistribute it and/or modify | 5 | This file is free software: you can redistribute it and/or modify |
| 6 | it under the terms of the GNU Lesser General Public License as | 6 | it under the terms of the GNU Lesser General Public License as |
| @@ -188,9 +188,9 @@ template <int w> | |||
| 188 | _gl_verify_type<(R) ? 1 : -1> | 188 | _gl_verify_type<(R) ? 1 : -1> |
| 189 | #elif defined _GL_HAVE__STATIC_ASSERT | 189 | #elif defined _GL_HAVE__STATIC_ASSERT |
| 190 | # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ | 190 | # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ |
| 191 | struct { \ | 191 | struct { \ |
| 192 | _Static_assert (R, DIAGNOSTIC); \ | 192 | _Static_assert (R, DIAGNOSTIC); \ |
| 193 | int _gl_dummy; \ | 193 | int _gl_dummy; \ |
| 194 | } | 194 | } |
| 195 | #else | 195 | #else |
| 196 | # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ | 196 | # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ |
| @@ -212,8 +212,8 @@ template <int w> | |||
| 212 | #elif defined _GL_HAVE__STATIC_ASSERT | 212 | #elif defined _GL_HAVE__STATIC_ASSERT |
| 213 | # define _GL_VERIFY(R, DIAGNOSTIC, ...) _Static_assert (R, DIAGNOSTIC) | 213 | # define _GL_VERIFY(R, DIAGNOSTIC, ...) _Static_assert (R, DIAGNOSTIC) |
| 214 | #else | 214 | #else |
| 215 | # define _GL_VERIFY(R, DIAGNOSTIC, ...) \ | 215 | # define _GL_VERIFY(R, DIAGNOSTIC, ...) \ |
| 216 | extern int (*_GL_GENSYM (_gl_verify_function) (void)) \ | 216 | extern int (*_GL_GENSYM (_gl_verify_function) (void)) \ |
| 217 | [_GL_VERIFY_TRUE (R, DIAGNOSTIC)] | 217 | [_GL_VERIFY_TRUE (R, DIAGNOSTIC)] |
| 218 | # if 4 < __GNUC__ + (6 <= __GNUC_MINOR__) | 218 | # if 4 < __GNUC__ + (6 <= __GNUC_MINOR__) |
| 219 | # pragma GCC diagnostic ignored "-Wnested-externs" | 219 | # pragma GCC diagnostic ignored "-Wnested-externs" |
| @@ -222,22 +222,43 @@ template <int w> | |||
| 222 | 222 | ||
| 223 | /* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */ | 223 | /* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */ |
| 224 | #ifdef _GL_STATIC_ASSERT_H | 224 | #ifdef _GL_STATIC_ASSERT_H |
| 225 | # if !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert | 225 | /* Define _Static_assert if needed. */ |
| 226 | /* With clang ≥ 3.8.0 in C++ mode, _Static_assert already works and accepts | ||
| 227 | 1 or 2 arguments. We better don't override it, because clang's standard | ||
| 228 | C++ library uses static_assert inside classes in several places, and our | ||
| 229 | replacement via _GL_VERIFY does not work in these contexts. */ | ||
| 230 | # if (defined __cplusplus && defined __clang__ \ | ||
| 231 | && (4 <= __clang_major__ + (8 <= __clang_minor__))) | ||
| 232 | # if 5 <= __clang_major__ | ||
| 233 | /* Avoid "warning: 'static_assert' with no message is a C++17 extension". */ | ||
| 234 | # pragma clang diagnostic ignored "-Wc++17-extensions" | ||
| 235 | # else | ||
| 236 | /* Avoid "warning: static_assert with no message is a C++1z extension". */ | ||
| 237 | # pragma clang diagnostic ignored "-Wc++1z-extensions" | ||
| 238 | # endif | ||
| 239 | # elif !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert | ||
| 226 | # if !defined _MSC_VER || defined __clang__ | 240 | # if !defined _MSC_VER || defined __clang__ |
| 227 | # define _Static_assert(...) \ | 241 | # define _Static_assert(...) \ |
| 228 | _GL_VERIFY (__VA_ARGS__, "static assertion failed", -) | 242 | _GL_VERIFY (__VA_ARGS__, "static assertion failed", -) |
| 229 | # else | 243 | # else |
| 230 | /* Work around MSVC preprocessor incompatibility with ISO C; see | 244 | # if defined __cplusplus && _MSC_VER >= 1910 |
| 231 | <https://stackoverflow.com/questions/5134523/>. */ | 245 | /* In MSVC 14.1 or newer, static_assert accepts one or two arguments, |
| 232 | # define _Static_assert(R, ...) \ | 246 | but _Static_assert is not defined. */ |
| 233 | _GL_VERIFY ((R), "static assertion failed", -) | 247 | # define _Static_assert static_assert |
| 248 | # else | ||
| 249 | /* Work around MSVC preprocessor incompatibility with ISO C; see | ||
| 250 | <https://stackoverflow.com/questions/5134523/>. */ | ||
| 251 | # define _Static_assert(R, ...) \ | ||
| 252 | _GL_VERIFY ((R), "static assertion failed", -) | ||
| 253 | # endif | ||
| 234 | # endif | 254 | # endif |
| 235 | # endif | 255 | # endif |
| 256 | /* Define static_assert if needed. */ | ||
| 236 | # if (!defined static_assert \ | 257 | # if (!defined static_assert \ |
| 237 | && __STDC_VERSION__ < 202311 \ | 258 | && __STDC_VERSION__ < 202311 \ |
| 238 | && (!defined __cplusplus \ | 259 | && (!defined __cplusplus \ |
| 239 | || (__cpp_static_assert < 201411 \ | 260 | || (__cpp_static_assert < 201411 \ |
| 240 | && __GNUG__ < 6 && __clang_major__ < 6))) | 261 | && __GNUG__ < 6 && __clang_major__ < 6 && _MSC_VER < 1910))) |
| 241 | # if defined __cplusplus && _MSC_VER >= 1900 && !defined __clang__ | 262 | # if defined __cplusplus && _MSC_VER >= 1900 && !defined __clang__ |
| 242 | /* MSVC 14 in C++ mode supports the two-arguments static_assert but not | 263 | /* MSVC 14 in C++ mode supports the two-arguments static_assert but not |
| 243 | the one-argument static_assert, and it does not support _Static_assert. | 264 | the one-argument static_assert, and it does not support _Static_assert. |
| @@ -250,6 +271,8 @@ template <int w> | |||
| 250 | # define _GL_SA3 static_assert | 271 | # define _GL_SA3 static_assert |
| 251 | # define _GL_SA_PICK(x1,x2,x3,x4,...) x4 | 272 | # define _GL_SA_PICK(x1,x2,x3,x4,...) x4 |
| 252 | # define static_assert(...) _GL_EXPAND(_GL_SA_PICK(__VA_ARGS__,_GL_SA3,_GL_SA2,_GL_SA1)) (__VA_ARGS__) | 273 | # define static_assert(...) _GL_EXPAND(_GL_SA_PICK(__VA_ARGS__,_GL_SA3,_GL_SA2,_GL_SA1)) (__VA_ARGS__) |
| 274 | /* Avoid "fatal error C1189: #error: The C++ Standard Library forbids macroizing keywords." */ | ||
| 275 | # define _ALLOW_KEYWORD_MACROS 1 | ||
| 253 | # else | 276 | # else |
| 254 | # define static_assert _Static_assert /* C11 requires this #define. */ | 277 | # define static_assert _Static_assert /* C11 requires this #define. */ |
| 255 | # endif | 278 | # endif |
| @@ -268,14 +291,16 @@ template <int w> | |||
| 268 | # define _GL_HAS_BUILTIN_TRAP 0 | 291 | # define _GL_HAS_BUILTIN_TRAP 0 |
| 269 | #endif | 292 | #endif |
| 270 | 293 | ||
| 271 | #if defined __clang_major__ && __clang_major__ < 5 | 294 | #ifndef _GL_HAS_BUILTIN_UNREACHABLE |
| 272 | # define _GL_HAS_BUILTIN_UNREACHABLE 0 | 295 | # if defined __clang_major__ && __clang_major__ < 5 |
| 273 | #elif 4 < __GNUC__ + (5 <= __GNUC_MINOR__) | 296 | # define _GL_HAS_BUILTIN_UNREACHABLE 0 |
| 274 | # define _GL_HAS_BUILTIN_UNREACHABLE 1 | 297 | # elif 4 < __GNUC__ + (5 <= __GNUC_MINOR__) |
| 275 | #elif defined __has_builtin | 298 | # define _GL_HAS_BUILTIN_UNREACHABLE 1 |
| 276 | # define _GL_HAS_BUILTIN_UNREACHABLE __has_builtin (__builtin_unreachable) | 299 | # elif defined __has_builtin |
| 277 | #else | 300 | # define _GL_HAS_BUILTIN_UNREACHABLE __has_builtin (__builtin_unreachable) |
| 278 | # define _GL_HAS_BUILTIN_UNREACHABLE 0 | 301 | # else |
| 302 | # define _GL_HAS_BUILTIN_UNREACHABLE 0 | ||
| 303 | # endif | ||
| 279 | #endif | 304 | #endif |
| 280 | 305 | ||
| 281 | /* Each of these macros verifies that its argument R is nonzero. To | 306 | /* Each of these macros verifies that its argument R is nonzero. To |
