diff options
Diffstat (limited to 'lib/verify.h')
| -rw-r--r-- | lib/verify.h | 77 | 
1 files changed, 56 insertions, 21 deletions
| diff --git a/lib/verify.h b/lib/verify.h index 99af8029..08268c24 100644 --- a/lib/verify.h +++ b/lib/verify.h @@ -1,6 +1,6 @@  /* Compile-time assert-like macros. -   Copyright (C) 2005-2006, 2009-2022 Free Software Foundation, Inc. +   Copyright (C) 2005-2006, 2009-2024 Free Software Foundation, Inc.     This file is free software: you can redistribute it and/or modify     it under the terms of the GNU Lesser General Public License as @@ -37,7 +37,7 @@            && (4 < __GNUC__ + (6 <= __GNUC_MINOR__) || 5 <= __clang_major__)))  #  define _GL_HAVE__STATIC_ASSERT 1  # endif -# if (202000 <= __STDC_VERSION__ \ +# if (202311 <= __STDC_VERSION__ \        || (!defined __STRICT_ANSI__ && 9 <= __GNUC__))  #  define _GL_HAVE__STATIC_ASSERT1 1  # endif @@ -188,9 +188,9 @@ template <int w>      _gl_verify_type<(R) ? 1 : -1>  #elif defined _GL_HAVE__STATIC_ASSERT  # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ -    struct {                                   \ -      _Static_assert (R, DIAGNOSTIC);          \ -      int _gl_dummy;                          \ +    struct { \ +      _Static_assert (R, DIAGNOSTIC); \ +      int _gl_dummy; \      }  #else  # define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \ @@ -212,8 +212,8 @@ template <int w>  #elif defined _GL_HAVE__STATIC_ASSERT  # define _GL_VERIFY(R, DIAGNOSTIC, ...) _Static_assert (R, DIAGNOSTIC)  #else -# define _GL_VERIFY(R, DIAGNOSTIC, ...)                                \ -    extern int (*_GL_GENSYM (_gl_verify_function) (void))	       \ +# define _GL_VERIFY(R, DIAGNOSTIC, ...) \ +    extern int (*_GL_GENSYM (_gl_verify_function) (void)) \        [_GL_VERIFY_TRUE (R, DIAGNOSTIC)]  # if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)  #  pragma GCC diagnostic ignored "-Wnested-externs" @@ -222,28 +222,57 @@ 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", -) +/* Define _Static_assert if needed.  */ +/* With clang ≥ 3.8.0 in C++ mode, _Static_assert already works and accepts +   1 or 2 arguments.  We better don't override it, because clang's standard +   C++ library uses static_assert inside classes in several places, and our +   replacement via _GL_VERIFY does not work in these contexts.  */ +# if (defined __cplusplus && defined __clang__ \ +      && (4 <= __clang_major__ + (8 <= __clang_minor__))) +#  if 5 <= __clang_major__ +/* Avoid "warning: 'static_assert' with no message is a C++17 extension".  */ +#   pragma clang diagnostic ignored "-Wc++17-extensions" +#  else +/* Avoid "warning: static_assert with no message is a C++1z extension".  */ +#   pragma clang diagnostic ignored "-Wc++1z-extensions" +#  endif +# elif !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert +#  if !defined _MSC_VER || defined __clang__ +#   define _Static_assert(...) \ +      _GL_VERIFY (__VA_ARGS__, "static assertion failed", -) +#  else +#   if defined __cplusplus && _MSC_VER >= 1910 +     /* In MSVC 14.1 or newer, static_assert accepts one or two arguments, +        but _Static_assert is not defined.  */ +#    define _Static_assert static_assert +#   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  # endif +/* Define static_assert if needed.  */  # if (!defined static_assert \        && __STDC_VERSION__ < 202311 \        && (!defined __cplusplus \            || (__cpp_static_assert < 201411 \ -              && __GNUG__ < 6 && __clang_major__ < 6))) +              && __GNUG__ < 6 && __clang_major__ < 6 && _MSC_VER < 1910)))  #  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. -   <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  #   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__) +/* Avoid "fatal error C1189: #error:  The C++ Standard Library forbids macroizing keywords."  */ +#   define _ALLOW_KEYWORD_MACROS 1  #  else  #   define static_assert _Static_assert /* C11 requires this #define. */  #  endif @@ -252,7 +281,9 @@ template <int w>  /* @assert.h omit start@  */ -#if 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__)) +#if defined __clang_major__ && __clang_major__ < 5 +# define _GL_HAS_BUILTIN_TRAP 0 +#elif 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__))  # define _GL_HAS_BUILTIN_TRAP 1  #elif defined __has_builtin  # define _GL_HAS_BUILTIN_TRAP __has_builtin (__builtin_trap) @@ -260,12 +291,16 @@ template <int w>  # define _GL_HAS_BUILTIN_TRAP 0  #endif -#if 4 < __GNUC__ + (5 <= __GNUC_MINOR__) -# define _GL_HAS_BUILTIN_UNREACHABLE 1 -#elif defined __has_builtin -# define _GL_HAS_BUILTIN_UNREACHABLE __has_builtin (__builtin_unreachable) -#else -# define _GL_HAS_BUILTIN_UNREACHABLE 0 +#ifndef _GL_HAS_BUILTIN_UNREACHABLE +# if defined __clang_major__ && __clang_major__ < 5 +#  define _GL_HAS_BUILTIN_UNREACHABLE 0 +# elif 4 < __GNUC__ + (5 <= __GNUC_MINOR__) +#  define _GL_HAS_BUILTIN_UNREACHABLE 1 +# elif defined __has_builtin +#  define _GL_HAS_BUILTIN_UNREACHABLE __has_builtin (__builtin_unreachable) +# else +#  define _GL_HAS_BUILTIN_UNREACHABLE 0 +# endif  #endif  /* Each of these macros verifies that its argument R is nonzero.  To | 
