| // Predefined symbols and macros -*- C++ -*- | |
| // Copyright (C) 1997-2026 Free Software Foundation, Inc. | |
| // | |
| // This file is part of the GNU ISO C++ Library. This library is free | |
| // software; you can redistribute it and/or modify it under the | |
| // terms of the GNU General Public License as published by the | |
| // Free Software Foundation; either version 3, or (at your option) | |
| // any later version. | |
| // This library is distributed in the hope that it will be useful, | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| // GNU General Public License for more details. | |
| // Under Section 7 of GPL version 3, you are granted additional | |
| // permissions described in the GCC Runtime Library Exception, version | |
| // 3.1, as published by the Free Software Foundation. | |
| // You should have received a copy of the GNU General Public License and | |
| // a copy of the GCC Runtime Library Exception along with this program; | |
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
| // <http://www.gnu.org/licenses/>. | |
| /** @file bits/c++config.h | |
| * This is an internal header file, included by other library headers. | |
| * Do not attempt to use it directly. @headername{version} | |
| */ | |
| #ifndef _GLIBCXX_CXX_CONFIG_H | |
| #define _GLIBCXX_CXX_CONFIG_H 1 | |
| #ifdef _GLIBCXX_SYSHDR | |
| #pragma GCC system_header | |
| #endif | |
| #pragma GCC diagnostic push | |
| #pragma GCC diagnostic ignored "-Wvariadic-macros" | |
| #if __cplusplus | |
| #pragma GCC diagnostic ignored "-Wc++11-extensions" | |
| #pragma GCC diagnostic ignored "-Wc++23-extensions" // bf16 | |
| #endif | |
| // The major release number for the GCC release the C++ library belongs to. | |
| #define _GLIBCXX_RELEASE | |
| // The datestamp of the C++ library in compressed ISO date format. | |
| #undef __GLIBCXX__ /* The testsuite defines it to 99999999 to block PCH. */ | |
| #define __GLIBCXX__ | |
| // Macros for various attributes. | |
| // _GLIBCXX_PURE | |
| // _GLIBCXX_CONST | |
| // _GLIBCXX_NORETURN | |
| // _GLIBCXX_NOTHROW | |
| // _GLIBCXX_VISIBILITY | |
| #ifndef _GLIBCXX_PURE | |
| # define _GLIBCXX_PURE __attribute__ ((__pure__)) | |
| #endif | |
| #ifndef _GLIBCXX_CONST | |
| # define _GLIBCXX_CONST __attribute__ ((__const__)) | |
| #endif | |
| #ifndef _GLIBCXX_NORETURN | |
| # define _GLIBCXX_NORETURN __attribute__ ((__noreturn__)) | |
| #endif | |
| // See below for C++ | |
| #ifndef _GLIBCXX_NOTHROW | |
| # ifndef __cplusplus | |
| # define _GLIBCXX_NOTHROW __attribute__((__nothrow__)) | |
| # endif | |
| #endif | |
| // Macros for visibility attributes. | |
| // _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY | |
| // _GLIBCXX_VISIBILITY | |
| #define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY | |
| #if _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY | |
| # define _GLIBCXX_VISIBILITY(V) __attribute__ ((__visibility__ (#V))) | |
| #else | |
| // If this is not supplied by the OS-specific or CPU-specific | |
| // headers included below, it will be defined to an empty default. | |
| # define _GLIBCXX_VISIBILITY(V) _GLIBCXX_PSEUDO_VISIBILITY(V) | |
| #endif | |
| // Macros for deprecated attributes. | |
| // _GLIBCXX_USE_DEPRECATED | |
| // _GLIBCXX_DEPRECATED | |
| // _GLIBCXX_DEPRECATED_SUGGEST( string-literal ) | |
| // _GLIBCXX11_DEPRECATED | |
| // _GLIBCXX11_DEPRECATED_SUGGEST( string-literal ) | |
| // _GLIBCXX14_DEPRECATED | |
| // _GLIBCXX14_DEPRECATED_SUGGEST( string-literal ) | |
| // _GLIBCXX17_DEPRECATED | |
| // _GLIBCXX17_DEPRECATED_SUGGEST( string-literal ) | |
| // _GLIBCXX20_DEPRECATED | |
| // _GLIBCXX20_DEPRECATED_SUGGEST( string-literal ) | |
| // _GLIBCXX23_DEPRECATED | |
| // _GLIBCXX23_DEPRECATED_SUGGEST( string-literal ) | |
| // _GLIBCXX26_DEPRECATED | |
| // _GLIBCXX26_DEPRECATED_SUGGEST( string-literal ) | |
| #ifndef _GLIBCXX_USE_DEPRECATED | |
| # define _GLIBCXX_USE_DEPRECATED 1 | |
| #endif | |
| #if defined(__DEPRECATED) | |
| # define _GLIBCXX_DEPRECATED __attribute__ ((__deprecated__)) | |
| # define _GLIBCXX_DEPRECATED_SUGGEST(ALT) \ | |
| __attribute__ ((__deprecated__ ("use '" ALT "' instead"))) | |
| #else | |
| # define _GLIBCXX_DEPRECATED | |
| # define _GLIBCXX_DEPRECATED_SUGGEST(ALT) | |
| #endif | |
| #if defined(__DEPRECATED) && (__cplusplus >= 201103L) | |
| # define _GLIBCXX11_DEPRECATED _GLIBCXX_DEPRECATED | |
| # define _GLIBCXX11_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUGGEST(ALT) | |
| #else | |
| # define _GLIBCXX11_DEPRECATED | |
| # define _GLIBCXX11_DEPRECATED_SUGGEST(ALT) | |
| #endif | |
| #if defined(__DEPRECATED) && (__cplusplus >= 201402L) | |
| # define _GLIBCXX14_DEPRECATED _GLIBCXX_DEPRECATED | |
| # define _GLIBCXX14_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUGGEST(ALT) | |
| #else | |
| # define _GLIBCXX14_DEPRECATED | |
| # define _GLIBCXX14_DEPRECATED_SUGGEST(ALT) | |
| #endif | |
| #if defined(__DEPRECATED) && (__cplusplus >= 201703L) | |
| # define _GLIBCXX17_DEPRECATED [[__deprecated__]] | |
| # define _GLIBCXX17_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUGGEST(ALT) | |
| #else | |
| # define _GLIBCXX17_DEPRECATED | |
| # define _GLIBCXX17_DEPRECATED_SUGGEST(ALT) | |
| #endif | |
| #if defined(__DEPRECATED) && (__cplusplus >= 202002L) | |
| # define _GLIBCXX20_DEPRECATED [[__deprecated__]] | |
| # define _GLIBCXX20_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUGGEST(ALT) | |
| #else | |
| # define _GLIBCXX20_DEPRECATED | |
| # define _GLIBCXX20_DEPRECATED_SUGGEST(ALT) | |
| #endif | |
| #if defined(__DEPRECATED) && (__cplusplus >= 202100L) | |
| # define _GLIBCXX23_DEPRECATED [[__deprecated__]] | |
| # define _GLIBCXX23_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUGGEST(ALT) | |
| #else | |
| # define _GLIBCXX23_DEPRECATED | |
| # define _GLIBCXX23_DEPRECATED_SUGGEST(ALT) | |
| #endif | |
| #if defined(__DEPRECATED) && (__cplusplus >= 202400L) | |
| # define _GLIBCXX26_DEPRECATED [[__deprecated__]] | |
| # define _GLIBCXX26_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUGGEST(ALT) | |
| #else | |
| # define _GLIBCXX26_DEPRECATED | |
| # define _GLIBCXX26_DEPRECATED_SUGGEST(ALT) | |
| #endif | |
| // Macros for ABI tag attributes. | |
| #ifndef _GLIBCXX_ABI_TAG_CXX11 | |
| # define _GLIBCXX_ABI_TAG_CXX11 __attribute ((__abi_tag__ ("cxx11"))) | |
| #endif | |
| // Macro to warn about unused results. | |
| #if __cplusplus >= 201103L | |
| # define _GLIBCXX_NODISCARD [[__nodiscard__]] | |
| #else | |
| # define _GLIBCXX_NODISCARD | |
| #endif | |
| #if __cplusplus | |
| // Macro for constexpr, to support in mixed 03/0x mode. | |
| #ifndef _GLIBCXX_CONSTEXPR | |
| # if __cplusplus >= 201103L | |
| # define _GLIBCXX_CONSTEXPR constexpr | |
| # define _GLIBCXX_USE_CONSTEXPR constexpr | |
| # else | |
| # define _GLIBCXX_CONSTEXPR | |
| # define _GLIBCXX_USE_CONSTEXPR const | |
| # endif | |
| #endif | |
| #ifndef _GLIBCXX14_CONSTEXPR | |
| # if __cplusplus >= 201402L | |
| # define _GLIBCXX14_CONSTEXPR constexpr | |
| # else | |
| # define _GLIBCXX14_CONSTEXPR | |
| # endif | |
| #endif | |
| #ifndef _GLIBCXX17_CONSTEXPR | |
| # if __cplusplus >= 201703L | |
| # define _GLIBCXX17_CONSTEXPR constexpr | |
| # else | |
| # define _GLIBCXX17_CONSTEXPR | |
| # endif | |
| #endif | |
| #ifndef _GLIBCXX20_CONSTEXPR | |
| # if __cplusplus >= 202002L | |
| # define _GLIBCXX20_CONSTEXPR constexpr | |
| # else | |
| # define _GLIBCXX20_CONSTEXPR | |
| # endif | |
| #endif | |
| #ifndef _GLIBCXX23_CONSTEXPR | |
| # if __cplusplus >= 202100L | |
| # define _GLIBCXX23_CONSTEXPR constexpr | |
| # else | |
| # define _GLIBCXX23_CONSTEXPR | |
| # endif | |
| #endif | |
| #ifndef _GLIBCXX26_CONSTEXPR | |
| # if __cplusplus >= 202400L | |
| # define _GLIBCXX26_CONSTEXPR constexpr | |
| # else | |
| # define _GLIBCXX26_CONSTEXPR | |
| # endif | |
| #endif | |
| #ifndef _GLIBCXX17_INLINE | |
| # if __cplusplus >= 201703L | |
| # define _GLIBCXX17_INLINE inline | |
| # else | |
| # define _GLIBCXX17_INLINE | |
| # endif | |
| #endif | |
| // Macro for noexcept, to support in mixed 03/0x mode. | |
| #ifndef _GLIBCXX_NOEXCEPT | |
| # if __cplusplus >= 201103L | |
| # define _GLIBCXX_NOEXCEPT noexcept | |
| # define _GLIBCXX_NOEXCEPT_IF(...) noexcept(__VA_ARGS__) | |
| # define _GLIBCXX_USE_NOEXCEPT noexcept | |
| # define _GLIBCXX_THROW(_EXC) | |
| # else | |
| # define _GLIBCXX_NOEXCEPT | |
| # define _GLIBCXX_NOEXCEPT_IF(...) | |
| # define _GLIBCXX_USE_NOEXCEPT throw() | |
| # define _GLIBCXX_THROW(_EXC) throw(_EXC) | |
| # endif | |
| #endif | |
| #ifndef _GLIBCXX_NOTHROW | |
| # define _GLIBCXX_NOTHROW _GLIBCXX_USE_NOEXCEPT | |
| #endif | |
| #ifndef _GLIBCXX_THROW_OR_ABORT | |
| # if __cpp_exceptions | |
| # define _GLIBCXX_THROW_OR_ABORT(_EXC) (throw (_EXC)) | |
| # else | |
| # define _GLIBCXX_THROW_OR_ABORT(_EXC) (__builtin_abort(), (void)(_EXC)) | |
| # endif | |
| #endif | |
| #if __cpp_noexcept_function_type | |
| #define _GLIBCXX_NOEXCEPT_PARM , bool _NE | |
| #define _GLIBCXX_NOEXCEPT_QUAL noexcept (_NE) | |
| #else | |
| #define _GLIBCXX_NOEXCEPT_PARM | |
| #define _GLIBCXX_NOEXCEPT_QUAL | |
| #endif | |
| #if __cpp_auto_cast | |
| # define _GLIBCXX_AUTO_CAST(X) auto(X) | |
| #else | |
| # define _GLIBCXX_AUTO_CAST(X) ::std::__decay_t<decltype((X))>(X) | |
| #endif | |
| // Macro for extern template, ie controlling template linkage via use | |
| // of extern keyword on template declaration. As documented in the g++ | |
| // manual, it inhibits all implicit instantiations and is used | |
| // throughout the library to avoid multiple weak definitions for | |
| // required types that are already explicitly instantiated in the | |
| // library binary. This substantially reduces the binary size of | |
| // resulting executables. | |
| // Special case: _GLIBCXX_EXTERN_TEMPLATE == -1 disallows extern | |
| // templates only in basic_string, thus activating its debug-mode | |
| // checks even at -O0. | |
| #define _GLIBCXX_EXTERN_TEMPLATE | |
| /* | |
| Outline of libstdc++ namespaces. | |
| namespace std | |
| { | |
| namespace __debug { } | |
| namespace __parallel { } | |
| namespace __cxx1998 { } | |
| namespace __detail { | |
| namespace __variant { } // C++17 | |
| } | |
| namespace rel_ops { } | |
| namespace tr1 | |
| { | |
| namespace placeholders { } | |
| namespace regex_constants { } | |
| namespace __detail { } | |
| } | |
| namespace tr2 { } | |
| namespace decimal { } | |
| namespace chrono { } // C++11 | |
| namespace placeholders { } // C++11 | |
| namespace regex_constants { } // C++11 | |
| namespace this_thread { } // C++11 | |
| inline namespace literals { // C++14 | |
| inline namespace chrono_literals { } // C++14 | |
| inline namespace complex_literals { } // C++14 | |
| inline namespace string_literals { } // C++14 | |
| inline namespace string_view_literals { } // C++17 | |
| } | |
| } | |
| namespace abi { } | |
| namespace __gnu_cxx | |
| { | |
| namespace __detail { } | |
| } | |
| For full details see: | |
| http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespaces.html | |
| */ | |
| namespace std | |
| { | |
| typedef __SIZE_TYPE__ size_t; | |
| typedef __PTRDIFF_TYPE__ ptrdiff_t; | |
| #if __cplusplus >= 201103L | |
| typedef decltype(nullptr) nullptr_t; | |
| #endif | |
| #pragma GCC visibility push(default) | |
| // This allows the library to terminate without including all of <exception> | |
| // and without making the declaration of std::terminate visible to users. | |
| extern "C++" __attribute__ ((__noreturn__, __always_inline__)) | |
| inline void __terminate() _GLIBCXX_USE_NOEXCEPT | |
| { | |
| void terminate() _GLIBCXX_USE_NOEXCEPT __attribute__ ((__noreturn__,__cold__)); | |
| terminate(); | |
| } | |
| #pragma GCC visibility pop | |
| } | |
| #define _GLIBCXX_USE_DUAL_ABI | |
| #if ! _GLIBCXX_USE_DUAL_ABI | |
| // Ignore any pre-defined value of _GLIBCXX_USE_CXX11_ABI | |
| # undef _GLIBCXX_USE_CXX11_ABI | |
| #endif | |
| #ifndef _GLIBCXX_USE_CXX11_ABI | |
| #define _GLIBCXX_USE_CXX11_ABI | |
| #endif | |
| #if _GLIBCXX_USE_CXX11_ABI | |
| namespace std | |
| { | |
| inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } | |
| } | |
| namespace __gnu_cxx | |
| { | |
| inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } | |
| } | |
| # define _GLIBCXX_NAMESPACE_CXX11 __cxx11:: | |
| # define _GLIBCXX_BEGIN_NAMESPACE_CXX11 namespace __cxx11 { | |
| # define _GLIBCXX_END_NAMESPACE_CXX11 } | |
| # define _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_ABI_TAG_CXX11 | |
| #else | |
| # define _GLIBCXX_NAMESPACE_CXX11 | |
| # define _GLIBCXX_BEGIN_NAMESPACE_CXX11 | |
| # define _GLIBCXX_END_NAMESPACE_CXX11 | |
| # define _GLIBCXX_DEFAULT_ABI_TAG | |
| #endif | |
| // Non-zero if inline namespaces are used for versioning the entire library. | |
| #define _GLIBCXX_INLINE_VERSION | |
| #if _GLIBCXX_INLINE_VERSION | |
| // Inline namespace for symbol versioning of (nearly) everything in std. | |
| # define _GLIBCXX_BEGIN_NAMESPACE_VERSION namespace __8 { | |
| # define _GLIBCXX_END_NAMESPACE_VERSION } | |
| // Unused when everything in std is versioned anyway. | |
| # define _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(X) | |
| # define _GLIBCXX_END_INLINE_ABI_NAMESPACE(X) | |
| namespace std | |
| { | |
| inline _GLIBCXX_BEGIN_NAMESPACE_VERSION | |
| #if __cplusplus >= 201402L | |
| inline namespace literals { | |
| inline namespace chrono_literals { } | |
| inline namespace complex_literals { } | |
| inline namespace string_literals { } | |
| #if __cplusplus > 201402L | |
| inline namespace string_view_literals { } | |
| #endif // C++17 | |
| } | |
| #endif // C++14 | |
| _GLIBCXX_END_NAMESPACE_VERSION | |
| } | |
| namespace __gnu_cxx | |
| { | |
| inline _GLIBCXX_BEGIN_NAMESPACE_VERSION | |
| _GLIBCXX_END_NAMESPACE_VERSION | |
| } | |
| #else | |
| // Unused. | |
| # define _GLIBCXX_BEGIN_NAMESPACE_VERSION | |
| # define _GLIBCXX_END_NAMESPACE_VERSION | |
| // Used to version individual components, e.g. std::_V2::error_category. | |
| # define _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(X) inline namespace X { | |
| # define _GLIBCXX_END_INLINE_ABI_NAMESPACE(X) } // inline namespace X | |
| #endif | |
| // In the case that we don't have a hosted environment, we can't provide the | |
| // debugging mode. Instead, we do our best and downgrade to assertions. | |
| #if defined(_GLIBCXX_DEBUG) && !__STDC_HOSTED__ | |
| #undef _GLIBCXX_DEBUG | |
| #define _GLIBCXX_ASSERTIONS 1 | |
| #endif | |
| // Inline namespaces for special modes: debug, parallel. | |
| #if defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_PARALLEL) | |
| namespace std | |
| { | |
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |
| // Non-inline namespace for components replaced by alternates in active mode. | |
| namespace __cxx1998 | |
| { | |
| # if _GLIBCXX_USE_CXX11_ABI | |
| inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } | |
| # endif | |
| } | |
| _GLIBCXX_END_NAMESPACE_VERSION | |
| // Inline namespace for debug mode. | |
| # ifdef _GLIBCXX_DEBUG | |
| inline namespace __debug { } | |
| # endif | |
| // Inline namespaces for parallel mode. | |
| # ifdef _GLIBCXX_PARALLEL | |
| inline namespace __parallel { } | |
| # endif | |
| } | |
| // Check for invalid usage and unsupported mixed-mode use. | |
| # if defined(_GLIBCXX_DEBUG) && defined(_GLIBCXX_PARALLEL) | |
| # error illegal use of multiple inlined namespaces | |
| # endif | |
| // Check for invalid use due to lack for weak symbols. | |
| # if __NO_INLINE__ && !__GXX_WEAK__ | |
| # warning currently using inlined namespace mode which may fail \ | |
| without inlining due to lack of weak symbols | |
| # endif | |
| #endif | |
| // Macros for namespace scope. Either namespace std:: or the name | |
| // of some nested namespace within it corresponding to the active mode. | |
| // _GLIBCXX_STD_A | |
| // _GLIBCXX_STD_C | |
| // | |
| // Macros for opening/closing conditional namespaces. | |
| // _GLIBCXX_BEGIN_NAMESPACE_ALGO | |
| // _GLIBCXX_END_NAMESPACE_ALGO | |
| // _GLIBCXX_BEGIN_NAMESPACE_CONTAINER | |
| // _GLIBCXX_END_NAMESPACE_CONTAINER | |
| #if defined(_GLIBCXX_DEBUG) | |
| # define _GLIBCXX_STD_C __cxx1998 | |
| # define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER \ | |
| namespace _GLIBCXX_STD_C { | |
| # define _GLIBCXX_END_NAMESPACE_CONTAINER } | |
| #else | |
| # define _GLIBCXX_STD_C std | |
| # define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER | |
| # define _GLIBCXX_END_NAMESPACE_CONTAINER | |
| #endif | |
| #ifdef _GLIBCXX_PARALLEL | |
| # define _GLIBCXX_STD_A __cxx1998 | |
| # define _GLIBCXX_BEGIN_NAMESPACE_ALGO \ | |
| namespace _GLIBCXX_STD_A { | |
| # define _GLIBCXX_END_NAMESPACE_ALGO } | |
| #else | |
| # define _GLIBCXX_STD_A std | |
| # define _GLIBCXX_BEGIN_NAMESPACE_ALGO | |
| # define _GLIBCXX_END_NAMESPACE_ALGO | |
| #endif | |
| // GLIBCXX_ABI Deprecated | |
| // Define if compatibility should be provided for -mlong-double-64. | |
| #undef _GLIBCXX_LONG_DOUBLE_COMPAT | |
| // Use an alternate macro to test for clang, so as to provide an easy | |
| // workaround for systems (such as vxworks) whose headers require | |
| // __clang__ to be defined, even when compiling with GCC. | |
| #if !defined _GLIBCXX_CLANG && defined __clang__ | |
| # define _GLIBCXX_CLANG __clang__ | |
| // Turn -D_GLIBCXX_CLANG=0 into -U_GLIBCXX_CLANG, so that | |
| // _GLIBCXX_CLANG can be tested as defined, just like __clang__. | |
| #elif !_GLIBCXX_CLANG | |
| # undef _GLIBCXX_CLANG | |
| #endif | |
| // Define if compatibility should be provided for alternative 128-bit long | |
| // double formats. Not possible for Clang until __ibm128 is supported. | |
| #ifndef _GLIBCXX_CLANG | |
| #undef _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT | |
| #endif | |
| // Inline namespaces for long double 128 modes. | |
| #if defined _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT \ | |
| && defined __LONG_DOUBLE_IEEE128__ | |
| namespace std | |
| { | |
| // Namespaces for 128-bit IEEE long double format on 64-bit POWER LE. | |
| inline namespace __gnu_cxx_ieee128 { } | |
| inline namespace __gnu_cxx11_ieee128 { } | |
| } | |
| # define _GLIBCXX_NAMESPACE_LDBL __gnu_cxx_ieee128:: | |
| # define _GLIBCXX_BEGIN_NAMESPACE_LDBL namespace __gnu_cxx_ieee128 { | |
| # define _GLIBCXX_END_NAMESPACE_LDBL } | |
| # define _GLIBCXX_NAMESPACE_LDBL_OR_CXX11 __gnu_cxx11_ieee128:: | |
| # define _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 namespace __gnu_cxx11_ieee128 { | |
| # define _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 } | |
| #else // _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT && IEEE128 | |
| #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | |
| namespace std | |
| { | |
| inline namespace __gnu_cxx_ldbl128 { } | |
| } | |
| # define _GLIBCXX_NAMESPACE_LDBL __gnu_cxx_ldbl128:: | |
| # define _GLIBCXX_BEGIN_NAMESPACE_LDBL namespace __gnu_cxx_ldbl128 { | |
| # define _GLIBCXX_END_NAMESPACE_LDBL } | |
| #else | |
| # define _GLIBCXX_NAMESPACE_LDBL | |
| # define _GLIBCXX_BEGIN_NAMESPACE_LDBL | |
| # define _GLIBCXX_END_NAMESPACE_LDBL | |
| #endif | |
| #if _GLIBCXX_USE_CXX11_ABI | |
| # define _GLIBCXX_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_NAMESPACE_CXX11 | |
| # define _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_BEGIN_NAMESPACE_CXX11 | |
| # define _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_END_NAMESPACE_CXX11 | |
| #else | |
| # define _GLIBCXX_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_NAMESPACE_LDBL | |
| # define _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_BEGIN_NAMESPACE_LDBL | |
| # define _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 _GLIBCXX_END_NAMESPACE_LDBL | |
| #endif | |
| #endif // _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT && IEEE128 | |
| namespace std | |
| { | |
| #pragma GCC visibility push(default) | |
| // Internal version of std::is_constant_evaluated(). | |
| // This can be used without checking if the compiler supports the feature. | |
| // The macro _GLIBCXX_HAVE_IS_CONSTANT_EVALUATED can be used to check if | |
| // the compiler support is present to make this function work as expected. | |
| __attribute__((__always_inline__)) | |
| _GLIBCXX_CONSTEXPR inline bool | |
| __is_constant_evaluated() _GLIBCXX_NOEXCEPT | |
| { | |
| #if __cpp_if_consteval >= 202106L | |
| # define _GLIBCXX_HAVE_IS_CONSTANT_EVALUATED 1 | |
| if consteval { return true; } else { return false; } | |
| #elif __cplusplus >= 201103L && __has_builtin(__builtin_is_constant_evaluated) | |
| # define _GLIBCXX_HAVE_IS_CONSTANT_EVALUATED 1 | |
| return __builtin_is_constant_evaluated(); | |
| #else | |
| return false; | |
| #endif | |
| } | |
| #pragma GCC visibility pop | |
| } | |
| #ifndef _GLIBCXX_ASSERTIONS | |
| # if defined(_GLIBCXX_DEBUG) | |
| // Debug Mode implies checking assertions. | |
| # define _GLIBCXX_ASSERTIONS 1 | |
| # elif ! defined(__OPTIMIZE__) && ! defined(_GLIBCXX_NO_ASSERTIONS) | |
| // Enable assertions for unoptimized builds. | |
| # define _GLIBCXX_ASSERTIONS 1 | |
| # endif | |
| #endif | |
| // Disable std::string explicit instantiation declarations in order to assert. | |
| #ifdef _GLIBCXX_ASSERTIONS | |
| # undef _GLIBCXX_EXTERN_TEMPLATE | |
| # define _GLIBCXX_EXTERN_TEMPLATE -1 | |
| #endif | |
| #undef _GLIBCXX_VERBOSE_ASSERT | |
| // Assert. | |
| #ifdef _GLIBCXX_VERBOSE_ASSERT | |
| namespace std | |
| { | |
| #pragma GCC visibility push(default) | |
| // Don't use <cassert> because this should be unaffected by NDEBUG. | |
| extern "C++" _GLIBCXX_NORETURN __attribute__((__cold__)) | |
| void | |
| __glibcxx_assert_fail /* Called when a precondition violation is detected. */ | |
| (const char* __file, int __line, const char* __function, | |
| const char* __condition) | |
| _GLIBCXX_NOEXCEPT; | |
| #pragma GCC visibility pop | |
| } | |
| # define _GLIBCXX_ASSERT_FAIL(_Condition) \ | |
| std::__glibcxx_assert_fail(__FILE__, __LINE__, __PRETTY_FUNCTION__, \ | |
| #_Condition) | |
| #else // ! VERBOSE_ASSERT | |
| # define _GLIBCXX_ASSERT_FAIL(_Condition) __builtin_abort() | |
| #endif | |
| #if defined(_GLIBCXX_ASSERTIONS) | |
| // When _GLIBCXX_ASSERTIONS is defined we enable runtime assertion checks. | |
| // These checks will also be done during constant evaluation. | |
| # define __glibcxx_assert(cond) \ | |
| do { \ | |
| if (__builtin_expect(!bool(cond), false)) \ | |
| _GLIBCXX_ASSERT_FAIL(cond); \ | |
| } while (false) | |
| #elif _GLIBCXX_HAVE_IS_CONSTANT_EVALUATED | |
| // _GLIBCXX_ASSERTIONS is not defined, so assertions checks are only enabled | |
| // during constant evaluation. This ensures we diagnose undefined behaviour | |
| // in constant expressions. | |
| namespace std | |
| { | |
| __attribute__((__always_inline__,__visibility__("default"))) | |
| inline void | |
| __glibcxx_assert_fail() | |
| { } | |
| } | |
| # define __glibcxx_assert(cond) \ | |
| do { \ | |
| if (std::__is_constant_evaluated() && !bool(cond)) \ | |
| std::__glibcxx_assert_fail(); \ | |
| } while (false) | |
| #else | |
| // _GLIBCXX_ASSERTIONS is not defined and __is_constant_evaluated() doesn't | |
| // work so don't check any assertions. | |
| # define __glibcxx_assert(cond) | |
| #endif | |
| // Macro indicating that TSAN is in use. | |
| #if __SANITIZE_THREAD__ | |
| # define _GLIBCXX_TSAN 1 | |
| #elif defined __has_feature | |
| # if __has_feature(thread_sanitizer) | |
| # define _GLIBCXX_TSAN 1 | |
| # endif | |
| #endif | |
| // Macros for race detectors. | |
| // _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) and | |
| // _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) should be used to explain | |
| // atomic (lock-free) synchronization to race detectors: | |
| // the race detector will infer a happens-before arc from the former to the | |
| // latter when they share the same argument pointer. | |
| // | |
| // The most frequent use case for these macros (and the only case in the | |
| // current implementation of the library) is atomic reference counting: | |
| // void _M_remove_reference() | |
| // { | |
| // _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount); | |
| // if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount, -1) <= 0) | |
| // { | |
| // _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount); | |
| // _M_destroy(__a); | |
| // } | |
| // } | |
| // The annotations in this example tell the race detector that all memory | |
| // accesses occurred when the refcount was positive do not race with | |
| // memory accesses which occurred after the refcount became zero. | |
| #ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE | |
| # define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) | |
| #endif | |
| #ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER | |
| # define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) | |
| #endif | |
| // Macros for C linkage: define extern "C" linkage only when using C++. | |
| # define _GLIBCXX_BEGIN_EXTERN_C extern "C" { | |
| # define _GLIBCXX_END_EXTERN_C } | |
| #define _GLIBCXX_USE_ALLOCATOR_NEW | |
| #ifdef __SIZEOF_INT128__ | |
| #if ! defined __GLIBCXX_TYPE_INT_N_0 && ! defined __STRICT_ANSI__ | |
| // If __int128 is supported, we expect __GLIBCXX_TYPE_INT_N_0 to be defined | |
| // unless the compiler is in strict mode. If it's not defined and the strict | |
| // macro is not defined, something is wrong. | |
| #warning "__STRICT_ANSI__ seems to have been undefined; this is not supported" | |
| #endif | |
| #endif | |
| #else // !__cplusplus | |
| # define _GLIBCXX_BEGIN_EXTERN_C | |
| # define _GLIBCXX_END_EXTERN_C | |
| #endif | |
| // First includes. | |
| // Pick up any OS-specific definitions. | |
| #include <bits/os_defines.h> | |
| // Pick up any CPU-specific definitions. | |
| #include <bits/cpu_defines.h> | |
| // If platform uses neither visibility nor psuedo-visibility, | |
| // specify empty default for namespace annotation macros. | |
| #ifndef _GLIBCXX_PSEUDO_VISIBILITY | |
| # define _GLIBCXX_PSEUDO_VISIBILITY(V) | |
| #endif | |
| // Certain function definitions that are meant to be overridable from | |
| // user code are decorated with this macro. For some targets, this | |
| // macro causes these definitions to be weak. | |
| #ifndef _GLIBCXX_WEAK_DEFINITION | |
| # define _GLIBCXX_WEAK_DEFINITION | |
| #endif | |
| // By default, we assume that __GXX_WEAK__ also means that there is support | |
| // for declaring functions as weak while not defining such functions. This | |
| // allows for referring to functions provided by other libraries (e.g., | |
| // libitm) without depending on them if the respective features are not used. | |
| #ifndef _GLIBCXX_USE_WEAK_REF | |
| # define _GLIBCXX_USE_WEAK_REF __GXX_WEAK__ | |
| #endif | |
| // Conditionally enable annotations for the Transactional Memory TS on C++11. | |
| // Most of the following conditions are due to limitations in the current | |
| // implementation. | |
| #if __cplusplus >= 201103L && _GLIBCXX_USE_CXX11_ABI \ | |
| && _GLIBCXX_USE_DUAL_ABI && __cpp_transactional_memory >= 201500L \ | |
| && !_GLIBCXX_FULLY_DYNAMIC_STRING && _GLIBCXX_USE_WEAK_REF \ | |
| && _GLIBCXX_USE_ALLOCATOR_NEW | |
| #define _GLIBCXX_TXN_SAFE transaction_safe | |
| #define _GLIBCXX_TXN_SAFE_DYN transaction_safe_dynamic | |
| #else | |
| #define _GLIBCXX_TXN_SAFE | |
| #define _GLIBCXX_TXN_SAFE_DYN | |
| #endif | |
| #if __cplusplus > 201402L | |
| // In C++17 mathematical special functions are in namespace std. | |
| # define _GLIBCXX_USE_STD_SPEC_FUNCS 1 | |
| #elif __cplusplus >= 201103L && __STDCPP_WANT_MATH_SPEC_FUNCS__ != 0 | |
| // For C++11 and C++14 they are in namespace std when requested. | |
| # define _GLIBCXX_USE_STD_SPEC_FUNCS 1 | |
| #endif | |
| // The remainder of the prewritten config is automatic; all the | |
| // user hooks are listed above. | |
| // Create a boolean flag to be used to determine if --fast-math is set. | |
| #ifdef __FAST_MATH__ | |
| # define _GLIBCXX_FAST_MATH 1 | |
| #else | |
| # define _GLIBCXX_FAST_MATH 0 | |
| #endif | |
| // This marks string literals in header files to be extracted for eventual | |
| // translation. It is primarily used for messages in thrown exceptions; see | |
| // src/functexcept.cc. We use __N because the more traditional _N is used | |
| // for something else under certain OSes (see BADNAMES). | |
| #define __N(msgid) (msgid) | |
| // For example, <windows.h> is known to #define min and max as macros... | |
| #undef min | |
| #undef max | |
| // N.B. these _GLIBCXX_USE_C99_XXX macros are defined unconditionally | |
| // so they should be tested with #if not with #ifdef. | |
| #if __cplusplus >= 201103L | |
| # ifndef _GLIBCXX_USE_C99_MATH | |
| # define _GLIBCXX_USE_C99_MATH _GLIBCXX11_USE_C99_MATH | |
| # endif | |
| # ifndef _GLIBCXX_USE_C99_COMPLEX | |
| # define _GLIBCXX_USE_C99_COMPLEX _GLIBCXX11_USE_C99_COMPLEX | |
| # endif | |
| # ifndef _GLIBCXX_USE_C99_STDIO | |
| # define _GLIBCXX_USE_C99_STDIO _GLIBCXX11_USE_C99_STDIO | |
| # endif | |
| # ifndef _GLIBCXX_USE_C99_STDLIB | |
| # define _GLIBCXX_USE_C99_STDLIB _GLIBCXX11_USE_C99_STDLIB | |
| # endif | |
| # ifndef _GLIBCXX_USE_C99_WCHAR | |
| # define _GLIBCXX_USE_C99_WCHAR _GLIBCXX11_USE_C99_WCHAR | |
| # endif | |
| #else | |
| # ifndef _GLIBCXX_USE_C99_MATH | |
| # define _GLIBCXX_USE_C99_MATH _GLIBCXX98_USE_C99_MATH | |
| # endif | |
| # ifndef _GLIBCXX_USE_C99_COMPLEX | |
| # define _GLIBCXX_USE_C99_COMPLEX _GLIBCXX98_USE_C99_COMPLEX | |
| # endif | |
| # ifndef _GLIBCXX_USE_C99_STDIO | |
| # define _GLIBCXX_USE_C99_STDIO _GLIBCXX98_USE_C99_STDIO | |
| # endif | |
| # ifndef _GLIBCXX_USE_C99_STDLIB | |
| # define _GLIBCXX_USE_C99_STDLIB _GLIBCXX98_USE_C99_STDLIB | |
| # endif | |
| # ifndef _GLIBCXX_USE_C99_WCHAR | |
| # define _GLIBCXX_USE_C99_WCHAR _GLIBCXX98_USE_C99_WCHAR | |
| # endif | |
| #endif | |
| // Unless explicitly specified, enable char8_t extensions only if the core | |
| // language char8_t feature macro is defined. | |
| #ifndef _GLIBCXX_USE_CHAR8_T | |
| # ifdef __cpp_char8_t | |
| # define _GLIBCXX_USE_CHAR8_T 1 | |
| # endif | |
| #endif | |
| #ifdef _GLIBCXX_USE_CHAR8_T | |
| # define __cpp_lib_char8_t 201907L | |
| #endif | |
| /* Define if __float128 is supported on this host. */ | |
| #if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) | |
| /* For powerpc64 don't use __float128 when it's the same type as long double. */ | |
| # if !(defined(_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT) && defined(__LONG_DOUBLE_IEEE128__)) | |
| # define _GLIBCXX_USE_FLOAT128 | |
| # endif | |
| #endif | |
| #if __FLT_MANT_DIG__ == 24 \ | |
| && __FLT_MIN_EXP__ == -125 \ | |
| && __FLT_MAX_EXP__ == 128 | |
| // Define if float has the IEEE binary32 format. | |
| # define _GLIBCXX_FLOAT_IS_IEEE_BINARY32 1 | |
| #endif | |
| #if __DBL_MANT_DIG__ == 53 \ | |
| && __DBL_MIN_EXP__ == -1021 \ | |
| && __DBL_MAX_EXP__ == 1024 | |
| // Define if double has the IEEE binary64 format. | |
| # define _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 1 | |
| #elif __FLT_MANT_DIG__ == 24 \ | |
| && __FLT_MIN_EXP__ == -125 \ | |
| && __FLT_MAX_EXP__ == 128 | |
| // Define if double has the IEEE binary32 format. | |
| # define _GLIBCXX_DOUBLE_IS_IEEE_BINARY32 1 | |
| #endif | |
| #if __LDBL_MANT_DIG__ == 113 \ | |
| && __LDBL_MIN_EXP__ == -16381 \ | |
| && __LDBL_MAX_EXP__ == 16384 | |
| // Define if long double has the IEEE binary128 format. | |
| # define _GLIBCXX_LDOUBLE_IS_IEEE_BINARY128 1 | |
| #elif __LDBL_MANT_DIG__ == 53 \ | |
| && __LDBL_MIN_EXP__ == -1021 \ | |
| && __LDBL_MAX_EXP__ == 1024 | |
| // Define if long double has the IEEE binary64 format. | |
| # define _GLIBCXX_LDOUBLE_IS_IEEE_BINARY64 1 | |
| #elif __LDBL_MANT_DIG__ == 24 \ | |
| && __LDBL_MIN_EXP__ == -125 \ | |
| && __LDBL_MAX_EXP__ == 128 | |
| // Define if long double has the IEEE binary32 format. | |
| # define _GLIBCXX_LDOUBLE_IS_IEEE_BINARY32 1 | |
| #endif | |
| #if defined __cplusplus && defined __BFLT16_DIG__ | |
| namespace __gnu_cxx | |
| { | |
| typedef __decltype(0.0bf16) __bfloat16_t; | |
| } | |
| #endif | |
| #ifdef __has_builtin | |
| # ifdef __is_identifier | |
| // Intel and older Clang require !__is_identifier for some built-ins: | |
| # define _GLIBCXX_HAS_BUILTIN(B) (__has_builtin(B) || ! __is_identifier(B)) | |
| # else | |
| # define _GLIBCXX_HAS_BUILTIN(B) __has_builtin(B) | |
| # endif | |
| #endif | |
| #if _GLIBCXX_HAS_BUILTIN(__has_unique_object_representations) | |
| # define _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP 1 | |
| #endif | |
| #if _GLIBCXX_HAS_BUILTIN(__is_aggregate) | |
| # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 | |
| #endif | |
| #if _GLIBCXX_HAS_BUILTIN(__builtin_launder) | |
| # define _GLIBCXX_HAVE_BUILTIN_LAUNDER 1 | |
| #endif | |
| // Returns 1 if _GLIBCXX_DO_NOT_USE_BUILTIN_TRAITS is not defined and the | |
| // compiler has a corresponding built-in type trait, 0 otherwise. | |
| // _GLIBCXX_DO_NOT_USE_BUILTIN_TRAITS can be defined to disable the use of | |
| // built-in traits. | |
| #ifndef _GLIBCXX_DO_NOT_USE_BUILTIN_TRAITS | |
| # define _GLIBCXX_USE_BUILTIN_TRAIT(BT) _GLIBCXX_HAS_BUILTIN(BT) | |
| #else | |
| # define _GLIBCXX_USE_BUILTIN_TRAIT(BT) 0 | |
| #endif | |
| #if __has_cpp_attribute(_Clang::__no_specializations__) | |
| # define _GLIBCXX_NO_SPECIALIZATIONS [[_Clang::__no_specializations__]] | |
| #else | |
| # define _GLIBCXX_NO_SPECIALIZATIONS | |
| #endif | |
| // Whether deducing this is usable either officially, if in C++23 mode, or | |
| // as an extension (Clang doesn't support the latter). | |
| #if __cpp_explicit_this_parameter \ | |
| || (__cplusplus >= 201103L && __GNUC__ >= 14 && !defined(_GLIBCXX_CLANG)) | |
| # define _GLIBCXX_EXPLICIT_THIS_PARAMETER 202110L | |
| #endif | |
| // Mark code that should be ignored by the compiler, but seen by Doxygen. | |
| #define _GLIBCXX_DOXYGEN_ONLY(X) | |
| // PSTL configuration | |
| #if __cplusplus >= 201703L | |
| // This header is not installed for freestanding: | |
| #if __has_include(<pstl/pstl_config.h>) | |
| // Preserved here so we have some idea which version of upstream we've pulled in | |
| // #define PSTL_VERSION 9000 | |
| // For now this defaults to being based on the presence of Thread Building Blocks | |
| # ifndef _GLIBCXX_USE_TBB_PAR_BACKEND | |
| # define _GLIBCXX_USE_TBB_PAR_BACKEND __has_include(<tbb/tbb.h>) | |
| # endif | |
| // This section will need some rework when a new (default) backend type is added | |
| # if _GLIBCXX_USE_TBB_PAR_BACKEND | |
| # define _PSTL_PAR_BACKEND_TBB | |
| # else | |
| # define _PSTL_PAR_BACKEND_SERIAL | |
| # endif | |
| # define _PSTL_ASSERT(_Condition) __glibcxx_assert(_Condition) | |
| # define _PSTL_ASSERT_MSG(_Condition, _Message) __glibcxx_assert(_Condition) | |
| #include <pstl/pstl_config.h> | |
| #endif // __has_include | |
| #endif // C++17 | |
| #pragma GCC diagnostic pop | |
| // End of prewritten config; the settings discovered at configure time follow. |