xref: /netbsd-src/external/apache2/llvm/dist/libcxx/include/__config (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg// -*- C++ -*-
2*4d6fc14bSjoerg//===--------------------------- __config ---------------------------------===//
3*4d6fc14bSjoerg//
4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information.
6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*4d6fc14bSjoerg//
8*4d6fc14bSjoerg//===----------------------------------------------------------------------===//
9*4d6fc14bSjoerg
10*4d6fc14bSjoerg#ifndef _LIBCPP_CONFIG
11*4d6fc14bSjoerg#define _LIBCPP_CONFIG
12*4d6fc14bSjoerg
13*4d6fc14bSjoerg#include <__config_site>
14*4d6fc14bSjoerg
15*4d6fc14bSjoerg#if defined(_MSC_VER) && !defined(__clang__)
16*4d6fc14bSjoerg#  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
17*4d6fc14bSjoerg#    define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
18*4d6fc14bSjoerg#  endif
19*4d6fc14bSjoerg#endif
20*4d6fc14bSjoerg
21*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
22*4d6fc14bSjoerg#pragma GCC system_header
23*4d6fc14bSjoerg#endif
24*4d6fc14bSjoerg
25*4d6fc14bSjoerg#ifdef __cplusplus
26*4d6fc14bSjoerg
27*4d6fc14bSjoerg#ifdef __GNUC__
28*4d6fc14bSjoerg#  define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
29*4d6fc14bSjoerg// The _GNUC_VER_NEW macro better represents the new GCC versioning scheme
30*4d6fc14bSjoerg// introduced in GCC 5.0.
31*4d6fc14bSjoerg#  define _GNUC_VER_NEW (_GNUC_VER * 10 + __GNUC_PATCHLEVEL__)
32*4d6fc14bSjoerg#else
33*4d6fc14bSjoerg#  define _GNUC_VER 0
34*4d6fc14bSjoerg#  define _GNUC_VER_NEW 0
35*4d6fc14bSjoerg#endif
36*4d6fc14bSjoerg
37*4d6fc14bSjoerg#define _LIBCPP_VERSION 13000
38*4d6fc14bSjoerg
39*4d6fc14bSjoerg#ifndef _LIBCPP_ABI_VERSION
40*4d6fc14bSjoerg#  define _LIBCPP_ABI_VERSION 1
41*4d6fc14bSjoerg#endif
42*4d6fc14bSjoerg
43*4d6fc14bSjoerg#if __STDC_HOSTED__ == 0
44*4d6fc14bSjoerg#  define _LIBCPP_FREESTANDING
45*4d6fc14bSjoerg#endif
46*4d6fc14bSjoerg
47*4d6fc14bSjoerg#ifndef _LIBCPP_STD_VER
48*4d6fc14bSjoerg#  if  __cplusplus <= 201103L
49*4d6fc14bSjoerg#    define _LIBCPP_STD_VER 11
50*4d6fc14bSjoerg#  elif __cplusplus <= 201402L
51*4d6fc14bSjoerg#    define _LIBCPP_STD_VER 14
52*4d6fc14bSjoerg#  elif __cplusplus <= 201703L
53*4d6fc14bSjoerg#    define _LIBCPP_STD_VER 17
54*4d6fc14bSjoerg#  elif __cplusplus <= 202002L
55*4d6fc14bSjoerg#    define _LIBCPP_STD_VER 20
56*4d6fc14bSjoerg#  else
57*4d6fc14bSjoerg#    define _LIBCPP_STD_VER 21  // current year, or date of c++2b ratification
58*4d6fc14bSjoerg#  endif
59*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER
60*4d6fc14bSjoerg
61*4d6fc14bSjoerg#if defined(__ELF__)
62*4d6fc14bSjoerg#  define _LIBCPP_OBJECT_FORMAT_ELF   1
63*4d6fc14bSjoerg#elif defined(__MACH__)
64*4d6fc14bSjoerg#  define _LIBCPP_OBJECT_FORMAT_MACHO 1
65*4d6fc14bSjoerg#elif defined(_WIN32)
66*4d6fc14bSjoerg#  define _LIBCPP_OBJECT_FORMAT_COFF  1
67*4d6fc14bSjoerg#elif defined(__wasm__)
68*4d6fc14bSjoerg#  define _LIBCPP_OBJECT_FORMAT_WASM  1
69*4d6fc14bSjoerg#else
70*4d6fc14bSjoerg   // ... add new file formats here ...
71*4d6fc14bSjoerg#endif
72*4d6fc14bSjoerg
73*4d6fc14bSjoerg#if defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2
74*4d6fc14bSjoerg// Change short string representation so that string data starts at offset 0,
75*4d6fc14bSjoerg// improving its alignment in some cases.
76*4d6fc14bSjoerg#  define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
77*4d6fc14bSjoerg// Fix deque iterator type in order to support incomplete types.
78*4d6fc14bSjoerg#  define _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
79*4d6fc14bSjoerg// Fix undefined behavior in how std::list stores its linked nodes.
80*4d6fc14bSjoerg#  define _LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB
81*4d6fc14bSjoerg// Fix undefined behavior in  how __tree stores its end and parent nodes.
82*4d6fc14bSjoerg#  define _LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB
83*4d6fc14bSjoerg// Fix undefined behavior in how __hash_table stores its pointer types.
84*4d6fc14bSjoerg#  define _LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB
85*4d6fc14bSjoerg#  define _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB
86*4d6fc14bSjoerg#  define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE
87*4d6fc14bSjoerg// Don't use a nullptr_t simulation type in C++03 instead using C++11 nullptr
88*4d6fc14bSjoerg// provided under the alternate keyword __nullptr, which changes the mangling
89*4d6fc14bSjoerg// of nullptr_t. This option is ABI incompatible with GCC in C++03 mode.
90*4d6fc14bSjoerg#  define _LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR
91*4d6fc14bSjoerg// Define a key function for `bad_function_call` in the library, to centralize
92*4d6fc14bSjoerg// its vtable and typeinfo to libc++ rather than having all other libraries
93*4d6fc14bSjoerg// using that class define their own copies.
94*4d6fc14bSjoerg#  define _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION
95*4d6fc14bSjoerg// Enable optimized version of __do_get_(un)signed which avoids redundant copies.
96*4d6fc14bSjoerg#  define _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
97*4d6fc14bSjoerg// Use the smallest possible integer type to represent the index of the variant.
98*4d6fc14bSjoerg// Previously libc++ used "unsigned int" exclusively.
99*4d6fc14bSjoerg#  define _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION
100*4d6fc14bSjoerg// Unstable attempt to provide a more optimized std::function
101*4d6fc14bSjoerg#  define _LIBCPP_ABI_OPTIMIZED_FUNCTION
102*4d6fc14bSjoerg// All the regex constants must be distinct and nonzero.
103*4d6fc14bSjoerg#  define _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
104*4d6fc14bSjoerg// Use raw pointers, not wrapped ones, for std::span's iterator type.
105*4d6fc14bSjoerg#  define _LIBCPP_ABI_SPAN_POINTER_ITERATORS
106*4d6fc14bSjoerg// Re-worked external template instantiations for std::string with a focus on
107*4d6fc14bSjoerg// performance and fast-path inlining.
108*4d6fc14bSjoerg#  define _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
109*4d6fc14bSjoerg// Enable clang::trivial_abi on std::unique_ptr.
110*4d6fc14bSjoerg#  define _LIBCPP_ABI_ENABLE_UNIQUE_PTR_TRIVIAL_ABI
111*4d6fc14bSjoerg// Enable clang::trivial_abi on std::shared_ptr and std::weak_ptr
112*4d6fc14bSjoerg#  define _LIBCPP_ABI_ENABLE_SHARED_PTR_TRIVIAL_ABI
113*4d6fc14bSjoerg#elif _LIBCPP_ABI_VERSION == 1
114*4d6fc14bSjoerg#  if !defined(_LIBCPP_OBJECT_FORMAT_COFF)
115*4d6fc14bSjoerg// Enable compiling copies of now inline methods into the dylib to support
116*4d6fc14bSjoerg// applications compiled against older libraries. This is unnecessary with
117*4d6fc14bSjoerg// COFF dllexport semantics, since dllexport forces a non-inline definition
118*4d6fc14bSjoerg// of inline functions to be emitted anyway. Our own non-inline copy would
119*4d6fc14bSjoerg// conflict with the dllexport-emitted copy, so we disable it.
120*4d6fc14bSjoerg#    define _LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS
121*4d6fc14bSjoerg#  endif
122*4d6fc14bSjoerg// Feature macros for disabling pre ABI v1 features. All of these options
123*4d6fc14bSjoerg// are deprecated.
124*4d6fc14bSjoerg#  if defined(__FreeBSD__)
125*4d6fc14bSjoerg#    define _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR
126*4d6fc14bSjoerg#  endif
127*4d6fc14bSjoerg#endif
128*4d6fc14bSjoerg
129*4d6fc14bSjoerg#if defined(_LIBCPP_BUILDING_LIBRARY) || defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2
130*4d6fc14bSjoerg// Enable additional explicit instantiations of iostreams components. This
131*4d6fc14bSjoerg// reduces the number of weak definitions generated in programs that use
132*4d6fc14bSjoerg// iostreams by providing a single strong definition in the shared library.
133*4d6fc14bSjoerg# define _LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1
134*4d6fc14bSjoerg#endif
135*4d6fc14bSjoerg
136*4d6fc14bSjoerg#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y
137*4d6fc14bSjoerg#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
138*4d6fc14bSjoerg
139*4d6fc14bSjoerg#ifndef _LIBCPP_ABI_NAMESPACE
140*4d6fc14bSjoerg# define _LIBCPP_ABI_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION)
141*4d6fc14bSjoerg#endif
142*4d6fc14bSjoerg
143*4d6fc14bSjoerg#if __cplusplus < 201103L
144*4d6fc14bSjoerg#define _LIBCPP_CXX03_LANG
145*4d6fc14bSjoerg#endif
146*4d6fc14bSjoerg
147*4d6fc14bSjoerg#ifndef __has_attribute
148*4d6fc14bSjoerg#define __has_attribute(__x) 0
149*4d6fc14bSjoerg#endif
150*4d6fc14bSjoerg
151*4d6fc14bSjoerg#ifndef __has_builtin
152*4d6fc14bSjoerg#define __has_builtin(__x) 0
153*4d6fc14bSjoerg#endif
154*4d6fc14bSjoerg
155*4d6fc14bSjoerg#ifndef __has_extension
156*4d6fc14bSjoerg#define __has_extension(__x) 0
157*4d6fc14bSjoerg#endif
158*4d6fc14bSjoerg
159*4d6fc14bSjoerg#ifndef __has_feature
160*4d6fc14bSjoerg#define __has_feature(__x) 0
161*4d6fc14bSjoerg#endif
162*4d6fc14bSjoerg
163*4d6fc14bSjoerg#ifndef __has_cpp_attribute
164*4d6fc14bSjoerg#define __has_cpp_attribute(__x) 0
165*4d6fc14bSjoerg#endif
166*4d6fc14bSjoerg
167*4d6fc14bSjoerg// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by
168*4d6fc14bSjoerg// the compiler and '1' otherwise.
169*4d6fc14bSjoerg#ifndef __is_identifier
170*4d6fc14bSjoerg#define __is_identifier(__x) 1
171*4d6fc14bSjoerg#endif
172*4d6fc14bSjoerg
173*4d6fc14bSjoerg#ifndef __has_declspec_attribute
174*4d6fc14bSjoerg#define __has_declspec_attribute(__x) 0
175*4d6fc14bSjoerg#endif
176*4d6fc14bSjoerg
177*4d6fc14bSjoerg#define __has_keyword(__x) !(__is_identifier(__x))
178*4d6fc14bSjoerg
179*4d6fc14bSjoerg#ifndef __has_include
180*4d6fc14bSjoerg#define __has_include(...) 0
181*4d6fc14bSjoerg#endif
182*4d6fc14bSjoerg
183*4d6fc14bSjoerg#if defined(__apple_build_version__)
184*4d6fc14bSjoerg#  define _LIBCPP_COMPILER_CLANG_BASED
185*4d6fc14bSjoerg#  define _LIBCPP_APPLE_CLANG_VER (__apple_build_version__ / 10000)
186*4d6fc14bSjoerg#elif defined(__clang__)
187*4d6fc14bSjoerg#  define _LIBCPP_COMPILER_CLANG_BASED
188*4d6fc14bSjoerg#  define _LIBCPP_CLANG_VER (__clang_major__ * 100 + __clang_minor__)
189*4d6fc14bSjoerg#elif defined(__GNUC__)
190*4d6fc14bSjoerg#  define _LIBCPP_COMPILER_GCC
191*4d6fc14bSjoerg#elif defined(_MSC_VER)
192*4d6fc14bSjoerg#  define _LIBCPP_COMPILER_MSVC
193*4d6fc14bSjoerg#elif defined(__IBMCPP__)
194*4d6fc14bSjoerg#  define _LIBCPP_COMPILER_IBM
195*4d6fc14bSjoerg#endif
196*4d6fc14bSjoerg
197*4d6fc14bSjoerg#if defined(_LIBCPP_COMPILER_GCC) && __cplusplus < 201103L
198*4d6fc14bSjoerg#error "libc++ does not support using GCC with C++03. Please enable C++11"
199*4d6fc14bSjoerg#endif
200*4d6fc14bSjoerg
201*4d6fc14bSjoerg// FIXME: ABI detection should be done via compiler builtin macros. This
202*4d6fc14bSjoerg// is just a placeholder until Clang implements such macros. For now assume
203*4d6fc14bSjoerg// that Windows compilers pretending to be MSVC++ target the Microsoft ABI,
204*4d6fc14bSjoerg// and allow the user to explicitly specify the ABI to handle cases where this
205*4d6fc14bSjoerg// heuristic falls short.
206*4d6fc14bSjoerg#if defined(_LIBCPP_ABI_FORCE_ITANIUM) && defined(_LIBCPP_ABI_FORCE_MICROSOFT)
207*4d6fc14bSjoerg#  error "Only one of _LIBCPP_ABI_FORCE_ITANIUM and _LIBCPP_ABI_FORCE_MICROSOFT can be defined"
208*4d6fc14bSjoerg#elif defined(_LIBCPP_ABI_FORCE_ITANIUM)
209*4d6fc14bSjoerg#  define _LIBCPP_ABI_ITANIUM
210*4d6fc14bSjoerg#elif defined(_LIBCPP_ABI_FORCE_MICROSOFT)
211*4d6fc14bSjoerg#  define _LIBCPP_ABI_MICROSOFT
212*4d6fc14bSjoerg#else
213*4d6fc14bSjoerg#  if defined(_WIN32) && defined(_MSC_VER)
214*4d6fc14bSjoerg#    define _LIBCPP_ABI_MICROSOFT
215*4d6fc14bSjoerg#  else
216*4d6fc14bSjoerg#    define _LIBCPP_ABI_ITANIUM
217*4d6fc14bSjoerg#  endif
218*4d6fc14bSjoerg#endif
219*4d6fc14bSjoerg
220*4d6fc14bSjoerg#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
221*4d6fc14bSjoerg# define _LIBCPP_ABI_VCRUNTIME
222*4d6fc14bSjoerg#endif
223*4d6fc14bSjoerg
224*4d6fc14bSjoerg// Need to detect which libc we're using if we're on Linux.
225*4d6fc14bSjoerg#if defined(__linux__)
226*4d6fc14bSjoerg#  include <features.h>
227*4d6fc14bSjoerg#  if defined(__GLIBC_PREREQ)
228*4d6fc14bSjoerg#    define _LIBCPP_GLIBC_PREREQ(a, b) __GLIBC_PREREQ(a, b)
229*4d6fc14bSjoerg#  else
230*4d6fc14bSjoerg#    define _LIBCPP_GLIBC_PREREQ(a, b) 0
231*4d6fc14bSjoerg#  endif // defined(__GLIBC_PREREQ)
232*4d6fc14bSjoerg#endif // defined(__linux__)
233*4d6fc14bSjoerg
234*4d6fc14bSjoerg#ifdef __LITTLE_ENDIAN__
235*4d6fc14bSjoerg#  if __LITTLE_ENDIAN__
236*4d6fc14bSjoerg#    define _LIBCPP_LITTLE_ENDIAN
237*4d6fc14bSjoerg#  endif  // __LITTLE_ENDIAN__
238*4d6fc14bSjoerg#endif // __LITTLE_ENDIAN__
239*4d6fc14bSjoerg
240*4d6fc14bSjoerg#ifdef __BIG_ENDIAN__
241*4d6fc14bSjoerg#  if __BIG_ENDIAN__
242*4d6fc14bSjoerg#    define _LIBCPP_BIG_ENDIAN
243*4d6fc14bSjoerg#  endif  // __BIG_ENDIAN__
244*4d6fc14bSjoerg#endif // __BIG_ENDIAN__
245*4d6fc14bSjoerg
246*4d6fc14bSjoerg#ifdef __BYTE_ORDER__
247*4d6fc14bSjoerg#  if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
248*4d6fc14bSjoerg#    define _LIBCPP_LITTLE_ENDIAN
249*4d6fc14bSjoerg#  elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
250*4d6fc14bSjoerg#    define _LIBCPP_BIG_ENDIAN
251*4d6fc14bSjoerg#  endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
252*4d6fc14bSjoerg#endif // __BYTE_ORDER__
253*4d6fc14bSjoerg
254*4d6fc14bSjoerg#ifdef __FreeBSD__
255*4d6fc14bSjoerg#  include <sys/endian.h>
256*4d6fc14bSjoerg#  include <osreldate.h>
257*4d6fc14bSjoerg#  if _BYTE_ORDER == _LITTLE_ENDIAN
258*4d6fc14bSjoerg#    define _LIBCPP_LITTLE_ENDIAN
259*4d6fc14bSjoerg#  else  // _BYTE_ORDER == _LITTLE_ENDIAN
260*4d6fc14bSjoerg#    define _LIBCPP_BIG_ENDIAN
261*4d6fc14bSjoerg#  endif  // _BYTE_ORDER == _LITTLE_ENDIAN
262*4d6fc14bSjoerg#  ifndef __LONG_LONG_SUPPORTED
263*4d6fc14bSjoerg#    define _LIBCPP_HAS_NO_LONG_LONG
264*4d6fc14bSjoerg#  endif  // __LONG_LONG_SUPPORTED
265*4d6fc14bSjoerg#endif // __FreeBSD__
266*4d6fc14bSjoerg
267*4d6fc14bSjoerg#if defined(__NetBSD__) || defined(__OpenBSD__)
268*4d6fc14bSjoerg#  include <sys/endian.h>
269*4d6fc14bSjoerg#  if _BYTE_ORDER == _LITTLE_ENDIAN
270*4d6fc14bSjoerg#    define _LIBCPP_LITTLE_ENDIAN
271*4d6fc14bSjoerg#  else  // _BYTE_ORDER == _LITTLE_ENDIAN
272*4d6fc14bSjoerg#    define _LIBCPP_BIG_ENDIAN
273*4d6fc14bSjoerg#  endif  // _BYTE_ORDER == _LITTLE_ENDIAN
274*4d6fc14bSjoerg#endif // defined(__NetBSD__) || defined(__OpenBSD__)
275*4d6fc14bSjoerg
276*4d6fc14bSjoerg#if defined(_WIN32)
277*4d6fc14bSjoerg#  define _LIBCPP_WIN32API
278*4d6fc14bSjoerg#  define _LIBCPP_LITTLE_ENDIAN
279*4d6fc14bSjoerg#  define _LIBCPP_SHORT_WCHAR   1
280*4d6fc14bSjoerg// Both MinGW and native MSVC provide a "MSVC"-like environment
281*4d6fc14bSjoerg#  define _LIBCPP_MSVCRT_LIKE
282*4d6fc14bSjoerg// If mingw not explicitly detected, assume using MS C runtime only if
283*4d6fc14bSjoerg// a MS compatibility version is specified.
284*4d6fc14bSjoerg#  if defined(_MSC_VER) && !defined(__MINGW32__)
285*4d6fc14bSjoerg#    define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
286*4d6fc14bSjoerg#  endif
287*4d6fc14bSjoerg#  if (defined(_M_AMD64) || defined(__x86_64__)) || (defined(_M_ARM) || defined(__arm__))
288*4d6fc14bSjoerg#    define _LIBCPP_HAS_BITSCAN64
289*4d6fc14bSjoerg#  endif
290*4d6fc14bSjoerg#  define _LIBCPP_HAS_OPEN_WITH_WCHAR
291*4d6fc14bSjoerg#  if defined(_LIBCPP_MSVCRT)
292*4d6fc14bSjoerg#    define _LIBCPP_HAS_QUICK_EXIT
293*4d6fc14bSjoerg#  endif
294*4d6fc14bSjoerg
295*4d6fc14bSjoerg// Some CRT APIs are unavailable to store apps
296*4d6fc14bSjoerg#  if defined(WINAPI_FAMILY)
297*4d6fc14bSjoerg#    include <winapifamily.h>
298*4d6fc14bSjoerg#    if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) &&                  \
299*4d6fc14bSjoerg        (!defined(WINAPI_PARTITION_SYSTEM) ||                                  \
300*4d6fc14bSjoerg         !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_SYSTEM))
301*4d6fc14bSjoerg#      define _LIBCPP_WINDOWS_STORE_APP
302*4d6fc14bSjoerg#    endif
303*4d6fc14bSjoerg#  endif
304*4d6fc14bSjoerg#endif // defined(_WIN32)
305*4d6fc14bSjoerg
306*4d6fc14bSjoerg#ifdef __sun__
307*4d6fc14bSjoerg#  include <sys/isa_defs.h>
308*4d6fc14bSjoerg#  ifdef _LITTLE_ENDIAN
309*4d6fc14bSjoerg#    define _LIBCPP_LITTLE_ENDIAN
310*4d6fc14bSjoerg#  else
311*4d6fc14bSjoerg#    define _LIBCPP_BIG_ENDIAN
312*4d6fc14bSjoerg#  endif
313*4d6fc14bSjoerg#endif // __sun__
314*4d6fc14bSjoerg
315*4d6fc14bSjoerg#if defined(__OpenBSD__) || defined(__CloudABI__)
316*4d6fc14bSjoerg   // Certain architectures provide arc4random(). Prefer using
317*4d6fc14bSjoerg   // arc4random() over /dev/{u,}random to make it possible to obtain
318*4d6fc14bSjoerg   // random data even when using sandboxing mechanisms such as chroots,
319*4d6fc14bSjoerg   // Capsicum, etc.
320*4d6fc14bSjoerg#  define _LIBCPP_USING_ARC4_RANDOM
321*4d6fc14bSjoerg#elif defined(__Fuchsia__) || defined(__wasi__)
322*4d6fc14bSjoerg#  define _LIBCPP_USING_GETENTROPY
323*4d6fc14bSjoerg#elif defined(__native_client__)
324*4d6fc14bSjoerg   // NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access,
325*4d6fc14bSjoerg   // including accesses to the special files under /dev. C++11's
326*4d6fc14bSjoerg   // std::random_device is instead exposed through a NaCl syscall.
327*4d6fc14bSjoerg#  define _LIBCPP_USING_NACL_RANDOM
328*4d6fc14bSjoerg#elif defined(_LIBCPP_WIN32API)
329*4d6fc14bSjoerg#  define _LIBCPP_USING_WIN32_RANDOM
330*4d6fc14bSjoerg#else
331*4d6fc14bSjoerg#  define _LIBCPP_USING_DEV_RANDOM
332*4d6fc14bSjoerg#endif
333*4d6fc14bSjoerg
334*4d6fc14bSjoerg#if !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN)
335*4d6fc14bSjoerg#  include <endian.h>
336*4d6fc14bSjoerg#  if __BYTE_ORDER == __LITTLE_ENDIAN
337*4d6fc14bSjoerg#    define _LIBCPP_LITTLE_ENDIAN
338*4d6fc14bSjoerg#  elif __BYTE_ORDER == __BIG_ENDIAN
339*4d6fc14bSjoerg#    define _LIBCPP_BIG_ENDIAN
340*4d6fc14bSjoerg#  else  // __BYTE_ORDER == __BIG_ENDIAN
341*4d6fc14bSjoerg#    error unable to determine endian
342*4d6fc14bSjoerg#  endif
343*4d6fc14bSjoerg#endif // !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN)
344*4d6fc14bSjoerg
345*4d6fc14bSjoerg#if __has_attribute(__no_sanitize__) && !defined(_LIBCPP_COMPILER_GCC)
346*4d6fc14bSjoerg#  define _LIBCPP_NO_CFI __attribute__((__no_sanitize__("cfi")))
347*4d6fc14bSjoerg#else
348*4d6fc14bSjoerg#  define _LIBCPP_NO_CFI
349*4d6fc14bSjoerg#endif
350*4d6fc14bSjoerg
351*4d6fc14bSjoerg#if (defined(__ISO_C_VISIBLE) && (__ISO_C_VISIBLE >= 2011)) || __cplusplus >= 201103L
352*4d6fc14bSjoerg#  if defined(__FreeBSD__)
353*4d6fc14bSjoerg#    define _LIBCPP_HAS_ALIGNED_ALLOC
354*4d6fc14bSjoerg#    define _LIBCPP_HAS_QUICK_EXIT
355*4d6fc14bSjoerg#    if __FreeBSD_version >= 1300064 || \
356*4d6fc14bSjoerg       (__FreeBSD_version >= 1201504 && __FreeBSD_version < 1300000)
357*4d6fc14bSjoerg#      define _LIBCPP_HAS_TIMESPEC_GET
358*4d6fc14bSjoerg#    endif
359*4d6fc14bSjoerg#  elif defined(__BIONIC__)
360*4d6fc14bSjoerg#    if __ANDROID_API__ >= 21
361*4d6fc14bSjoerg#      define _LIBCPP_HAS_QUICK_EXIT
362*4d6fc14bSjoerg#    endif
363*4d6fc14bSjoerg#    if __ANDROID_API__ >= 28
364*4d6fc14bSjoerg#      define _LIBCPP_HAS_ALIGNED_ALLOC
365*4d6fc14bSjoerg#    endif
366*4d6fc14bSjoerg#    if __ANDROID_API__ >= 29
367*4d6fc14bSjoerg#      define _LIBCPP_HAS_TIMESPEC_GET
368*4d6fc14bSjoerg#    endif
369*4d6fc14bSjoerg#  elif defined(__Fuchsia__) || defined(__wasi__) || defined(__NetBSD__)
370*4d6fc14bSjoerg#    define _LIBCPP_HAS_ALIGNED_ALLOC
371*4d6fc14bSjoerg#    define _LIBCPP_HAS_QUICK_EXIT
372*4d6fc14bSjoerg#    define _LIBCPP_HAS_TIMESPEC_GET
373*4d6fc14bSjoerg#  elif defined(__OpenBSD__)
374*4d6fc14bSjoerg#    define _LIBCPP_HAS_ALIGNED_ALLOC
375*4d6fc14bSjoerg#    define _LIBCPP_HAS_TIMESPEC_GET
376*4d6fc14bSjoerg#  elif defined(__linux__)
377*4d6fc14bSjoerg#    if !defined(_LIBCPP_HAS_MUSL_LIBC)
378*4d6fc14bSjoerg#      if _LIBCPP_GLIBC_PREREQ(2, 15) || defined(__BIONIC__)
379*4d6fc14bSjoerg#        define _LIBCPP_HAS_QUICK_EXIT
380*4d6fc14bSjoerg#      endif
381*4d6fc14bSjoerg#      if _LIBCPP_GLIBC_PREREQ(2, 17)
382*4d6fc14bSjoerg#        define _LIBCPP_HAS_ALIGNED_ALLOC
383*4d6fc14bSjoerg#        define _LIBCPP_HAS_TIMESPEC_GET
384*4d6fc14bSjoerg#      endif
385*4d6fc14bSjoerg#    else // defined(_LIBCPP_HAS_MUSL_LIBC)
386*4d6fc14bSjoerg#      define _LIBCPP_HAS_ALIGNED_ALLOC
387*4d6fc14bSjoerg#      define _LIBCPP_HAS_QUICK_EXIT
388*4d6fc14bSjoerg#      define _LIBCPP_HAS_TIMESPEC_GET
389*4d6fc14bSjoerg#    endif
390*4d6fc14bSjoerg#  elif defined(__APPLE__)
391*4d6fc14bSjoerg     // timespec_get and aligned_alloc were introduced in macOS 10.15 and
392*4d6fc14bSjoerg     // aligned releases
393*4d6fc14bSjoerg#    if ((defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101500) || \
394*4d6fc14bSjoerg         (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130000) || \
395*4d6fc14bSjoerg         (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ >= 130000) || \
396*4d6fc14bSjoerg         (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ >= 60000))
397*4d6fc14bSjoerg#      define _LIBCPP_HAS_ALIGNED_ALLOC
398*4d6fc14bSjoerg#      define _LIBCPP_HAS_TIMESPEC_GET
399*4d6fc14bSjoerg#    endif
400*4d6fc14bSjoerg#  endif // __APPLE__
401*4d6fc14bSjoerg#endif
402*4d6fc14bSjoerg
403*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
404*4d6fc14bSjoerg# define _LIBCPP_ALIGNOF(_Tp) alignof(_Tp)
405*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_CLANG_BASED)
406*4d6fc14bSjoerg# define _LIBCPP_ALIGNOF(_Tp) _Alignof(_Tp)
407*4d6fc14bSjoerg#else
408*4d6fc14bSjoerg# error "We don't know a correct way to implement alignof(T) in C++03 outside of Clang"
409*4d6fc14bSjoerg#endif
410*4d6fc14bSjoerg
411*4d6fc14bSjoerg#define _LIBCPP_PREFERRED_ALIGNOF(_Tp) __alignof(_Tp)
412*4d6fc14bSjoerg
413*4d6fc14bSjoerg#if defined(_LIBCPP_COMPILER_CLANG_BASED)
414*4d6fc14bSjoerg
415*4d6fc14bSjoerg#if defined(_LIBCPP_ALTERNATE_STRING_LAYOUT)
416*4d6fc14bSjoerg#  error _LIBCPP_ALTERNATE_STRING_LAYOUT is deprecated, please use _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT instead
417*4d6fc14bSjoerg#endif
418*4d6fc14bSjoerg#if defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) &&       \
419*4d6fc14bSjoerg    (!defined(__arm__) || __ARM_ARCH_7K__ >= 2)
420*4d6fc14bSjoerg#  define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
421*4d6fc14bSjoerg#endif
422*4d6fc14bSjoerg
423*4d6fc14bSjoerg#if __has_feature(cxx_alignas)
424*4d6fc14bSjoerg#  define _ALIGNAS_TYPE(x) alignas(x)
425*4d6fc14bSjoerg#  define _ALIGNAS(x) alignas(x)
426*4d6fc14bSjoerg#else
427*4d6fc14bSjoerg#  define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x))))
428*4d6fc14bSjoerg#  define _ALIGNAS(x) __attribute__((__aligned__(x)))
429*4d6fc14bSjoerg#endif
430*4d6fc14bSjoerg
431*4d6fc14bSjoerg#if __cplusplus < 201103L
432*4d6fc14bSjoergtypedef __char16_t char16_t;
433*4d6fc14bSjoergtypedef __char32_t char32_t;
434*4d6fc14bSjoerg#endif
435*4d6fc14bSjoerg
436*4d6fc14bSjoerg#if !__has_feature(cxx_exceptions)
437*4d6fc14bSjoerg#  define _LIBCPP_NO_EXCEPTIONS
438*4d6fc14bSjoerg#endif
439*4d6fc14bSjoerg
440*4d6fc14bSjoerg#if !(__has_feature(cxx_strong_enums))
441*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_STRONG_ENUMS
442*4d6fc14bSjoerg#endif
443*4d6fc14bSjoerg
444*4d6fc14bSjoerg#if __has_feature(cxx_attributes)
445*4d6fc14bSjoerg#  define _LIBCPP_NORETURN [[noreturn]]
446*4d6fc14bSjoerg#else
447*4d6fc14bSjoerg#  define _LIBCPP_NORETURN __attribute__ ((noreturn))
448*4d6fc14bSjoerg#endif
449*4d6fc14bSjoerg
450*4d6fc14bSjoerg#if !(__has_feature(cxx_nullptr))
451*4d6fc14bSjoerg#  if (__has_extension(cxx_nullptr) || __has_keyword(__nullptr)) && defined(_LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR)
452*4d6fc14bSjoerg#    define nullptr __nullptr
453*4d6fc14bSjoerg#  else
454*4d6fc14bSjoerg#    define _LIBCPP_HAS_NO_NULLPTR
455*4d6fc14bSjoerg#  endif
456*4d6fc14bSjoerg#endif
457*4d6fc14bSjoerg
458*4d6fc14bSjoerg// Objective-C++ features (opt-in)
459*4d6fc14bSjoerg#if __has_feature(objc_arc)
460*4d6fc14bSjoerg#define _LIBCPP_HAS_OBJC_ARC
461*4d6fc14bSjoerg#endif
462*4d6fc14bSjoerg
463*4d6fc14bSjoerg#if __has_feature(objc_arc_weak)
464*4d6fc14bSjoerg#define _LIBCPP_HAS_OBJC_ARC_WEAK
465*4d6fc14bSjoerg#endif
466*4d6fc14bSjoerg
467*4d6fc14bSjoerg#if __has_extension(blocks)
468*4d6fc14bSjoerg#  define _LIBCPP_HAS_EXTENSION_BLOCKS
469*4d6fc14bSjoerg#endif
470*4d6fc14bSjoerg
471*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_EXTENSION_BLOCKS) && defined(__APPLE__)
472*4d6fc14bSjoerg#  define _LIBCPP_HAS_BLOCKS_RUNTIME
473*4d6fc14bSjoerg#endif
474*4d6fc14bSjoerg
475*4d6fc14bSjoerg#if !(__has_feature(cxx_relaxed_constexpr))
476*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
477*4d6fc14bSjoerg#endif
478*4d6fc14bSjoerg
479*4d6fc14bSjoerg#if !(__has_feature(cxx_variable_templates))
480*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
481*4d6fc14bSjoerg#endif
482*4d6fc14bSjoerg
483*4d6fc14bSjoerg#if !(__has_feature(cxx_noexcept))
484*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_NOEXCEPT
485*4d6fc14bSjoerg#endif
486*4d6fc14bSjoerg
487*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_ASAN) && !__has_feature(address_sanitizer)
488*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_ASAN
489*4d6fc14bSjoerg#endif
490*4d6fc14bSjoerg
491*4d6fc14bSjoerg// Allow for build-time disabling of unsigned integer sanitization
492*4d6fc14bSjoerg#if !defined(_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK) && __has_attribute(no_sanitize)
493*4d6fc14bSjoerg#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK __attribute__((__no_sanitize__("unsigned-integer-overflow")))
494*4d6fc14bSjoerg#endif
495*4d6fc14bSjoerg
496*4d6fc14bSjoerg#if __has_builtin(__builtin_launder)
497*4d6fc14bSjoerg#define _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER
498*4d6fc14bSjoerg#endif
499*4d6fc14bSjoerg
500*4d6fc14bSjoerg#if __has_builtin(__builtin_constant_p)
501*4d6fc14bSjoerg#define _LIBCPP_COMPILER_HAS_BUILTIN_CONSTANT_P
502*4d6fc14bSjoerg#endif
503*4d6fc14bSjoerg
504*4d6fc14bSjoerg#if !__is_identifier(__has_unique_object_representations)
505*4d6fc14bSjoerg#define _LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS
506*4d6fc14bSjoerg#endif
507*4d6fc14bSjoerg
508*4d6fc14bSjoerg#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
509*4d6fc14bSjoerg
510*4d6fc14bSjoerg// Literal operators ""d and ""y are supported starting with LLVM Clang 8 and AppleClang 10.0.1
511*4d6fc14bSjoerg#if (defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER < 800) ||                 \
512*4d6fc14bSjoerg    (defined(_LIBCPP_APPLE_CLANG_VER) && _LIBCPP_APPLE_CLANG_VER < 1001)
513*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CXX20_CHRONO_LITERALS
514*4d6fc14bSjoerg#endif
515*4d6fc14bSjoerg
516*4d6fc14bSjoerg#define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__
517*4d6fc14bSjoerg
518*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_GCC)
519*4d6fc14bSjoerg
520*4d6fc14bSjoerg#define _ALIGNAS(x) __attribute__((__aligned__(x)))
521*4d6fc14bSjoerg#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x))))
522*4d6fc14bSjoerg
523*4d6fc14bSjoerg#define _LIBCPP_NORETURN __attribute__((noreturn))
524*4d6fc14bSjoerg
525*4d6fc14bSjoerg#if !__EXCEPTIONS
526*4d6fc14bSjoerg#  define _LIBCPP_NO_EXCEPTIONS
527*4d6fc14bSjoerg#endif
528*4d6fc14bSjoerg
529*4d6fc14bSjoerg// Determine if GCC supports relaxed constexpr
530*4d6fc14bSjoerg#if !defined(__cpp_constexpr) || __cpp_constexpr < 201304L
531*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
532*4d6fc14bSjoerg#endif
533*4d6fc14bSjoerg
534*4d6fc14bSjoerg// GCC 5 supports variable templates
535*4d6fc14bSjoerg#if !defined(__cpp_variable_templates) || __cpp_variable_templates < 201304L
536*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
537*4d6fc14bSjoerg#endif
538*4d6fc14bSjoerg
539*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_ASAN) && !defined(__SANITIZE_ADDRESS__)
540*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_ASAN
541*4d6fc14bSjoerg#endif
542*4d6fc14bSjoerg
543*4d6fc14bSjoerg#if _GNUC_VER >= 700
544*4d6fc14bSjoerg#define _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER
545*4d6fc14bSjoerg#define _LIBCPP_COMPILER_HAS_BUILTIN_CONSTANT_P
546*4d6fc14bSjoerg#define _LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS
547*4d6fc14bSjoerg#endif
548*4d6fc14bSjoerg
549*4d6fc14bSjoerg#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
550*4d6fc14bSjoerg
551*4d6fc14bSjoerg#define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__
552*4d6fc14bSjoerg
553*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_MSVC)
554*4d6fc14bSjoerg
555*4d6fc14bSjoerg#define _LIBCPP_TOSTRING2(x) #x
556*4d6fc14bSjoerg#define _LIBCPP_TOSTRING(x) _LIBCPP_TOSTRING2(x)
557*4d6fc14bSjoerg#define _LIBCPP_WARNING(x) __pragma(message(__FILE__ "(" _LIBCPP_TOSTRING(__LINE__) ") : warning note: " x))
558*4d6fc14bSjoerg
559*4d6fc14bSjoerg#if _MSC_VER < 1900
560*4d6fc14bSjoerg#error "MSVC versions prior to Visual Studio 2015 are not supported"
561*4d6fc14bSjoerg#endif
562*4d6fc14bSjoerg
563*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
564*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
565*4d6fc14bSjoerg#define __alignof__ __alignof
566*4d6fc14bSjoerg#define _LIBCPP_NORETURN __declspec(noreturn)
567*4d6fc14bSjoerg#define _ALIGNAS(x) __declspec(align(x))
568*4d6fc14bSjoerg#define _ALIGNAS_TYPE(x) alignas(x)
569*4d6fc14bSjoerg
570*4d6fc14bSjoerg#define _LIBCPP_WEAK
571*4d6fc14bSjoerg
572*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_ASAN
573*4d6fc14bSjoerg
574*4d6fc14bSjoerg#define _LIBCPP_ALWAYS_INLINE __forceinline
575*4d6fc14bSjoerg
576*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VECTOR_EXTENSION
577*4d6fc14bSjoerg
578*4d6fc14bSjoerg#define _LIBCPP_DISABLE_EXTENSION_WARNING
579*4d6fc14bSjoerg
580*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_IBM)
581*4d6fc14bSjoerg
582*4d6fc14bSjoerg#define _ALIGNAS(x) __attribute__((__aligned__(x)))
583*4d6fc14bSjoerg#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x))))
584*4d6fc14bSjoerg#define _ATTRIBUTE(x) __attribute__((x))
585*4d6fc14bSjoerg#define _LIBCPP_NORETURN __attribute__((noreturn))
586*4d6fc14bSjoerg
587*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_UNICODE_CHARS
588*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
589*4d6fc14bSjoerg
590*4d6fc14bSjoerg#if defined(_AIX)
591*4d6fc14bSjoerg#define __MULTILOCALE_API
592*4d6fc14bSjoerg#endif
593*4d6fc14bSjoerg
594*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_ASAN
595*4d6fc14bSjoerg
596*4d6fc14bSjoerg#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
597*4d6fc14bSjoerg
598*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_VECTOR_EXTENSION
599*4d6fc14bSjoerg
600*4d6fc14bSjoerg#define _LIBCPP_DISABLE_EXTENSION_WARNING
601*4d6fc14bSjoerg
602*4d6fc14bSjoerg#endif // _LIBCPP_COMPILER_[CLANG|GCC|MSVC|IBM]
603*4d6fc14bSjoerg
604*4d6fc14bSjoerg#if defined(_LIBCPP_OBJECT_FORMAT_COFF)
605*4d6fc14bSjoerg
606*4d6fc14bSjoerg#ifdef _DLL
607*4d6fc14bSjoerg#  define _LIBCPP_CRT_FUNC __declspec(dllimport)
608*4d6fc14bSjoerg#else
609*4d6fc14bSjoerg#  define _LIBCPP_CRT_FUNC
610*4d6fc14bSjoerg#endif
611*4d6fc14bSjoerg
612*4d6fc14bSjoerg#if defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
613*4d6fc14bSjoerg#  define _LIBCPP_DLL_VIS
614*4d6fc14bSjoerg#  define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
615*4d6fc14bSjoerg#  define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
616*4d6fc14bSjoerg#  define _LIBCPP_OVERRIDABLE_FUNC_VIS
617*4d6fc14bSjoerg#  define _LIBCPP_EXPORTED_FROM_ABI
618*4d6fc14bSjoerg#elif defined(_LIBCPP_BUILDING_LIBRARY)
619*4d6fc14bSjoerg#  define _LIBCPP_DLL_VIS __declspec(dllexport)
620*4d6fc14bSjoerg#  if defined(__MINGW32__)
621*4d6fc14bSjoerg#    define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS
622*4d6fc14bSjoerg#    define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
623*4d6fc14bSjoerg#  else
624*4d6fc14bSjoerg#    define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
625*4d6fc14bSjoerg#    define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DLL_VIS
626*4d6fc14bSjoerg#  endif
627*4d6fc14bSjoerg#  define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_DLL_VIS
628*4d6fc14bSjoerg#  define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllexport)
629*4d6fc14bSjoerg#else
630*4d6fc14bSjoerg#  define _LIBCPP_DLL_VIS __declspec(dllimport)
631*4d6fc14bSjoerg#  define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS
632*4d6fc14bSjoerg#  define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
633*4d6fc14bSjoerg#  define _LIBCPP_OVERRIDABLE_FUNC_VIS
634*4d6fc14bSjoerg#  define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllimport)
635*4d6fc14bSjoerg#endif
636*4d6fc14bSjoerg
637*4d6fc14bSjoerg#define _LIBCPP_TYPE_VIS            _LIBCPP_DLL_VIS
638*4d6fc14bSjoerg#define _LIBCPP_FUNC_VIS            _LIBCPP_DLL_VIS
639*4d6fc14bSjoerg#define _LIBCPP_EXCEPTION_ABI       _LIBCPP_DLL_VIS
640*4d6fc14bSjoerg#define _LIBCPP_HIDDEN
641*4d6fc14bSjoerg#define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
642*4d6fc14bSjoerg#define _LIBCPP_TEMPLATE_VIS
643*4d6fc14bSjoerg#define _LIBCPP_TEMPLATE_DATA_VIS
644*4d6fc14bSjoerg#define _LIBCPP_ENUM_VIS
645*4d6fc14bSjoerg
646*4d6fc14bSjoerg#endif // defined(_LIBCPP_OBJECT_FORMAT_COFF)
647*4d6fc14bSjoerg
648*4d6fc14bSjoerg#ifndef _LIBCPP_HIDDEN
649*4d6fc14bSjoerg#  if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
650*4d6fc14bSjoerg#    define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
651*4d6fc14bSjoerg#  else
652*4d6fc14bSjoerg#    define _LIBCPP_HIDDEN
653*4d6fc14bSjoerg#  endif
654*4d6fc14bSjoerg#endif
655*4d6fc14bSjoerg
656*4d6fc14bSjoerg#ifndef _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
657*4d6fc14bSjoerg#  if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
658*4d6fc14bSjoerg// The inline should be removed once PR32114 is resolved
659*4d6fc14bSjoerg#    define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS inline _LIBCPP_HIDDEN
660*4d6fc14bSjoerg#  else
661*4d6fc14bSjoerg#    define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
662*4d6fc14bSjoerg#  endif
663*4d6fc14bSjoerg#endif
664*4d6fc14bSjoerg
665*4d6fc14bSjoerg#ifndef _LIBCPP_FUNC_VIS
666*4d6fc14bSjoerg#  if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
667*4d6fc14bSjoerg#    define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default")))
668*4d6fc14bSjoerg#  else
669*4d6fc14bSjoerg#    define _LIBCPP_FUNC_VIS
670*4d6fc14bSjoerg#  endif
671*4d6fc14bSjoerg#endif
672*4d6fc14bSjoerg
673*4d6fc14bSjoerg#ifndef _LIBCPP_TYPE_VIS
674*4d6fc14bSjoerg#  if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
675*4d6fc14bSjoerg#    define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
676*4d6fc14bSjoerg#  else
677*4d6fc14bSjoerg#    define _LIBCPP_TYPE_VIS
678*4d6fc14bSjoerg#  endif
679*4d6fc14bSjoerg#endif
680*4d6fc14bSjoerg
681*4d6fc14bSjoerg#ifndef _LIBCPP_TEMPLATE_VIS
682*4d6fc14bSjoerg#  if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
683*4d6fc14bSjoerg#    if __has_attribute(__type_visibility__)
684*4d6fc14bSjoerg#      define _LIBCPP_TEMPLATE_VIS __attribute__ ((__type_visibility__("default")))
685*4d6fc14bSjoerg#    else
686*4d6fc14bSjoerg#      define _LIBCPP_TEMPLATE_VIS __attribute__ ((__visibility__("default")))
687*4d6fc14bSjoerg#    endif
688*4d6fc14bSjoerg#  else
689*4d6fc14bSjoerg#    define _LIBCPP_TEMPLATE_VIS
690*4d6fc14bSjoerg#  endif
691*4d6fc14bSjoerg#endif
692*4d6fc14bSjoerg
693*4d6fc14bSjoerg#ifndef _LIBCPP_TEMPLATE_DATA_VIS
694*4d6fc14bSjoerg#  if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
695*4d6fc14bSjoerg#    define _LIBCPP_TEMPLATE_DATA_VIS __attribute__ ((__visibility__("default")))
696*4d6fc14bSjoerg#  else
697*4d6fc14bSjoerg#    define _LIBCPP_TEMPLATE_DATA_VIS
698*4d6fc14bSjoerg#  endif
699*4d6fc14bSjoerg#endif
700*4d6fc14bSjoerg
701*4d6fc14bSjoerg#ifndef _LIBCPP_EXPORTED_FROM_ABI
702*4d6fc14bSjoerg#  if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
703*4d6fc14bSjoerg#    define _LIBCPP_EXPORTED_FROM_ABI __attribute__((__visibility__("default")))
704*4d6fc14bSjoerg#  else
705*4d6fc14bSjoerg#    define _LIBCPP_EXPORTED_FROM_ABI
706*4d6fc14bSjoerg#  endif
707*4d6fc14bSjoerg#endif
708*4d6fc14bSjoerg
709*4d6fc14bSjoerg#ifndef _LIBCPP_OVERRIDABLE_FUNC_VIS
710*4d6fc14bSjoerg#define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_FUNC_VIS
711*4d6fc14bSjoerg#endif
712*4d6fc14bSjoerg
713*4d6fc14bSjoerg#ifndef _LIBCPP_EXCEPTION_ABI
714*4d6fc14bSjoerg#  if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
715*4d6fc14bSjoerg#    define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default")))
716*4d6fc14bSjoerg#  else
717*4d6fc14bSjoerg#    define _LIBCPP_EXCEPTION_ABI
718*4d6fc14bSjoerg#  endif
719*4d6fc14bSjoerg#endif
720*4d6fc14bSjoerg
721*4d6fc14bSjoerg#ifndef _LIBCPP_ENUM_VIS
722*4d6fc14bSjoerg#  if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) && __has_attribute(__type_visibility__)
723*4d6fc14bSjoerg#    define _LIBCPP_ENUM_VIS __attribute__ ((__type_visibility__("default")))
724*4d6fc14bSjoerg#  else
725*4d6fc14bSjoerg#    define _LIBCPP_ENUM_VIS
726*4d6fc14bSjoerg#  endif
727*4d6fc14bSjoerg#endif
728*4d6fc14bSjoerg
729*4d6fc14bSjoerg#ifndef _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
730*4d6fc14bSjoerg#  if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
731*4d6fc14bSjoerg#    define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __attribute__ ((__visibility__("default")))
732*4d6fc14bSjoerg#  else
733*4d6fc14bSjoerg#    define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
734*4d6fc14bSjoerg#  endif
735*4d6fc14bSjoerg#endif
736*4d6fc14bSjoerg
737*4d6fc14bSjoerg#ifndef _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
738*4d6fc14bSjoerg#define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
739*4d6fc14bSjoerg#endif
740*4d6fc14bSjoerg
741*4d6fc14bSjoerg#if __has_attribute(internal_linkage)
742*4d6fc14bSjoerg#  define _LIBCPP_INTERNAL_LINKAGE __attribute__ ((internal_linkage))
743*4d6fc14bSjoerg#else
744*4d6fc14bSjoerg#  define _LIBCPP_INTERNAL_LINKAGE _LIBCPP_ALWAYS_INLINE
745*4d6fc14bSjoerg#endif
746*4d6fc14bSjoerg
747*4d6fc14bSjoerg#if __has_attribute(exclude_from_explicit_instantiation)
748*4d6fc14bSjoerg#  define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION __attribute__ ((__exclude_from_explicit_instantiation__))
749*4d6fc14bSjoerg#else
750*4d6fc14bSjoerg   // Try to approximate the effect of exclude_from_explicit_instantiation
751*4d6fc14bSjoerg   // (which is that entities are not assumed to be provided by explicit
752*4d6fc14bSjoerg   // template instantiations in the dylib) by always inlining those entities.
753*4d6fc14bSjoerg#  define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION _LIBCPP_ALWAYS_INLINE
754*4d6fc14bSjoerg#endif
755*4d6fc14bSjoerg
756*4d6fc14bSjoerg#ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU
757*4d6fc14bSjoerg#  ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT
758*4d6fc14bSjoerg#    define _LIBCPP_HIDE_FROM_ABI_PER_TU 0
759*4d6fc14bSjoerg#  else
760*4d6fc14bSjoerg#    define _LIBCPP_HIDE_FROM_ABI_PER_TU 1
761*4d6fc14bSjoerg#  endif
762*4d6fc14bSjoerg#endif
763*4d6fc14bSjoerg
764*4d6fc14bSjoerg#ifndef _LIBCPP_HIDE_FROM_ABI
765*4d6fc14bSjoerg#  if _LIBCPP_HIDE_FROM_ABI_PER_TU
766*4d6fc14bSjoerg#    define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_INTERNAL_LINKAGE
767*4d6fc14bSjoerg#  else
768*4d6fc14bSjoerg#    define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION
769*4d6fc14bSjoerg#  endif
770*4d6fc14bSjoerg#endif
771*4d6fc14bSjoerg
772*4d6fc14bSjoerg#ifdef _LIBCPP_BUILDING_LIBRARY
773*4d6fc14bSjoerg#  if _LIBCPP_ABI_VERSION > 1
774*4d6fc14bSjoerg#    define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI
775*4d6fc14bSjoerg#  else
776*4d6fc14bSjoerg#    define _LIBCPP_HIDE_FROM_ABI_AFTER_V1
777*4d6fc14bSjoerg#  endif
778*4d6fc14bSjoerg#else
779*4d6fc14bSjoerg#  define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI
780*4d6fc14bSjoerg#endif
781*4d6fc14bSjoerg
782*4d6fc14bSjoerg// Just so we can migrate to the new macros gradually.
783*4d6fc14bSjoerg#define _LIBCPP_INLINE_VISIBILITY _LIBCPP_HIDE_FROM_ABI
784*4d6fc14bSjoerg
785*4d6fc14bSjoerg// Inline namespaces are available in Clang/GCC/MSVC regardless of C++ dialect.
786*4d6fc14bSjoerg#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { inline namespace _LIBCPP_ABI_NAMESPACE {
787*4d6fc14bSjoerg#define _LIBCPP_END_NAMESPACE_STD  } }
788*4d6fc14bSjoerg#define _VSTD std::_LIBCPP_ABI_NAMESPACE
789*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD
790*4d6fc14bSjoerg
791*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17
792*4d6fc14bSjoerg#define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \
793*4d6fc14bSjoerg  _LIBCPP_BEGIN_NAMESPACE_STD inline namespace __fs { namespace filesystem {
794*4d6fc14bSjoerg#else
795*4d6fc14bSjoerg#define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \
796*4d6fc14bSjoerg  _LIBCPP_BEGIN_NAMESPACE_STD namespace __fs { namespace filesystem {
797*4d6fc14bSjoerg#endif
798*4d6fc14bSjoerg
799*4d6fc14bSjoerg#define _LIBCPP_END_NAMESPACE_FILESYSTEM \
800*4d6fc14bSjoerg  _LIBCPP_END_NAMESPACE_STD } }
801*4d6fc14bSjoerg
802*4d6fc14bSjoerg#define _VSTD_FS _VSTD::__fs::filesystem
803*4d6fc14bSjoerg
804*4d6fc14bSjoerg#ifndef _LIBCPP_PREFERRED_OVERLOAD
805*4d6fc14bSjoerg#  if __has_attribute(__enable_if__)
806*4d6fc14bSjoerg#    define _LIBCPP_PREFERRED_OVERLOAD __attribute__ ((__enable_if__(true, "")))
807*4d6fc14bSjoerg#  endif
808*4d6fc14bSjoerg#endif
809*4d6fc14bSjoerg
810*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_NOEXCEPT
811*4d6fc14bSjoerg#  define _NOEXCEPT noexcept
812*4d6fc14bSjoerg#  define _NOEXCEPT_(x) noexcept(x)
813*4d6fc14bSjoerg#else
814*4d6fc14bSjoerg#  define _NOEXCEPT throw()
815*4d6fc14bSjoerg#  define _NOEXCEPT_(x)
816*4d6fc14bSjoerg#endif
817*4d6fc14bSjoerg
818*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
819*4d6fc14bSjoergtypedef unsigned short char16_t;
820*4d6fc14bSjoergtypedef unsigned int   char32_t;
821*4d6fc14bSjoerg#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
822*4d6fc14bSjoerg
823*4d6fc14bSjoerg#ifndef __SIZEOF_INT128__
824*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_INT128
825*4d6fc14bSjoerg#endif
826*4d6fc14bSjoerg
827*4d6fc14bSjoerg#ifdef _LIBCPP_CXX03_LANG
828*4d6fc14bSjoerg# define static_assert(...) _Static_assert(__VA_ARGS__)
829*4d6fc14bSjoerg# define decltype(...) __decltype(__VA_ARGS__)
830*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG
831*4d6fc14bSjoerg
832*4d6fc14bSjoerg#ifdef _LIBCPP_CXX03_LANG
833*4d6fc14bSjoerg#  define _LIBCPP_CONSTEXPR
834*4d6fc14bSjoerg#else
835*4d6fc14bSjoerg#  define _LIBCPP_CONSTEXPR constexpr
836*4d6fc14bSjoerg#endif
837*4d6fc14bSjoerg
838*4d6fc14bSjoerg#ifndef __cpp_consteval
839*4d6fc14bSjoerg#  define _LIBCPP_CONSTEVAL _LIBCPP_CONSTEXPR
840*4d6fc14bSjoerg#else
841*4d6fc14bSjoerg#  define _LIBCPP_CONSTEVAL consteval
842*4d6fc14bSjoerg#endif
843*4d6fc14bSjoerg
844*4d6fc14bSjoerg#if !defined(__cpp_concepts) || __cpp_concepts < 201907L
845*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CONCEPTS
846*4d6fc14bSjoerg#endif
847*4d6fc14bSjoerg
848*4d6fc14bSjoerg#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_HAS_NO_CONCEPTS)
849*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_RANGES
850*4d6fc14bSjoerg#endif
851*4d6fc14bSjoerg
852*4d6fc14bSjoerg#ifdef _LIBCPP_CXX03_LANG
853*4d6fc14bSjoerg#  define _LIBCPP_DEFAULT {}
854*4d6fc14bSjoerg#else
855*4d6fc14bSjoerg#  define _LIBCPP_DEFAULT = default;
856*4d6fc14bSjoerg#endif
857*4d6fc14bSjoerg
858*4d6fc14bSjoerg#ifdef _LIBCPP_CXX03_LANG
859*4d6fc14bSjoerg#  define _LIBCPP_EQUAL_DELETE
860*4d6fc14bSjoerg#else
861*4d6fc14bSjoerg#  define _LIBCPP_EQUAL_DELETE = delete
862*4d6fc14bSjoerg#endif
863*4d6fc14bSjoerg
864*4d6fc14bSjoerg#ifdef __GNUC__
865*4d6fc14bSjoerg#  define _LIBCPP_NOALIAS __attribute__((__malloc__))
866*4d6fc14bSjoerg#else
867*4d6fc14bSjoerg#  define _LIBCPP_NOALIAS
868*4d6fc14bSjoerg#endif
869*4d6fc14bSjoerg
870*4d6fc14bSjoerg#if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__) || \
871*4d6fc14bSjoerg    (!defined(_LIBCPP_CXX03_LANG) && defined(__GNUC__)) // All supported GCC versions
872*4d6fc14bSjoerg#  define _LIBCPP_EXPLICIT explicit
873*4d6fc14bSjoerg#else
874*4d6fc14bSjoerg#  define _LIBCPP_EXPLICIT
875*4d6fc14bSjoerg#endif
876*4d6fc14bSjoerg
877*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
878*4d6fc14bSjoerg#  define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_TYPE_VIS x { enum __lx
879*4d6fc14bSjoerg#  define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \
880*4d6fc14bSjoerg     __lx __v_; \
881*4d6fc14bSjoerg     _LIBCPP_INLINE_VISIBILITY x(__lx __v) : __v_(__v) {} \
882*4d6fc14bSjoerg     _LIBCPP_INLINE_VISIBILITY explicit x(int __v) : __v_(static_cast<__lx>(__v)) {} \
883*4d6fc14bSjoerg     _LIBCPP_INLINE_VISIBILITY operator int() const {return __v_;} \
884*4d6fc14bSjoerg     };
885*4d6fc14bSjoerg#else  // _LIBCPP_HAS_NO_STRONG_ENUMS
886*4d6fc14bSjoerg#  define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_ENUM_VIS x
887*4d6fc14bSjoerg#  define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x)
888*4d6fc14bSjoerg#endif // _LIBCPP_HAS_NO_STRONG_ENUMS
889*4d6fc14bSjoerg
890*4d6fc14bSjoerg// _LIBCPP_DEBUG potential values:
891*4d6fc14bSjoerg//  - undefined: No assertions. This is the default.
892*4d6fc14bSjoerg//  - 0:         Basic assertions
893*4d6fc14bSjoerg//  - 1:         Basic assertions + iterator validity checks.
894*4d6fc14bSjoerg#if !defined(_LIBCPP_DEBUG)
895*4d6fc14bSjoerg# define _LIBCPP_DEBUG_LEVEL 0
896*4d6fc14bSjoerg#elif _LIBCPP_DEBUG == 0
897*4d6fc14bSjoerg# define _LIBCPP_DEBUG_LEVEL 1
898*4d6fc14bSjoerg#elif _LIBCPP_DEBUG == 1
899*4d6fc14bSjoerg# define _LIBCPP_DEBUG_LEVEL 2
900*4d6fc14bSjoerg#else
901*4d6fc14bSjoerg# error Supported values for _LIBCPP_DEBUG are 0 and 1
902*4d6fc14bSjoerg#endif
903*4d6fc14bSjoerg
904*4d6fc14bSjoerg// _LIBCPP_DEBUG_LEVEL is always defined to one of [0, 1, 2] at this point
905*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL >= 1 && !defined(_LIBCPP_DISABLE_EXTERN_TEMPLATE)
906*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE(...)
907*4d6fc14bSjoerg#endif
908*4d6fc14bSjoerg
909*4d6fc14bSjoerg#ifdef _LIBCPP_DISABLE_EXTERN_TEMPLATE
910*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE(...)
911*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(...)
912*4d6fc14bSjoerg#endif
913*4d6fc14bSjoerg
914*4d6fc14bSjoerg#ifndef _LIBCPP_EXTERN_TEMPLATE
915*4d6fc14bSjoerg#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
916*4d6fc14bSjoerg#endif
917*4d6fc14bSjoerg
918*4d6fc14bSjoerg// When the Debug mode is enabled, we disable extern declarations because we
919*4d6fc14bSjoerg// don't want to use the functions compiled in the library, which might not
920*4d6fc14bSjoerg// have had the debug mode enabled when built. However, some extern declarations
921*4d6fc14bSjoerg// need to be used, because code correctness depends on it (several instances
922*4d6fc14bSjoerg// in the <locale>). Those special declarations are declared with
923*4d6fc14bSjoerg// _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE, which is enabled even
924*4d6fc14bSjoerg// when the debug mode is enabled.
925*4d6fc14bSjoerg#ifndef _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE
926*4d6fc14bSjoerg# define _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(...) extern template __VA_ARGS__;
927*4d6fc14bSjoerg#endif
928*4d6fc14bSjoerg
929*4d6fc14bSjoerg#ifndef _LIBCPP_EXTERN_TEMPLATE_DEFINE
930*4d6fc14bSjoerg#define _LIBCPP_EXTERN_TEMPLATE_DEFINE(...) template __VA_ARGS__;
931*4d6fc14bSjoerg#endif
932*4d6fc14bSjoerg
933*4d6fc14bSjoerg#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_LIBCPP_MSVCRT_LIKE) || \
934*4d6fc14bSjoerg    defined(__sun__) || defined(__NetBSD__) || defined(__CloudABI__)
935*4d6fc14bSjoerg#define _LIBCPP_LOCALE__L_EXTENSIONS 1
936*4d6fc14bSjoerg#endif
937*4d6fc14bSjoerg
938*4d6fc14bSjoerg#ifdef __FreeBSD__
939*4d6fc14bSjoerg#define _DECLARE_C99_LDBL_MATH 1
940*4d6fc14bSjoerg#endif
941*4d6fc14bSjoerg
942*4d6fc14bSjoerg// If we are getting operator new from the MSVC CRT, then allocation overloads
943*4d6fc14bSjoerg// for align_val_t were added in 19.12, aka VS 2017 version 15.3.
944*4d6fc14bSjoerg#if defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912
945*4d6fc14bSjoerg#  define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
946*4d6fc14bSjoerg#elif defined(_LIBCPP_ABI_VCRUNTIME) && !defined(__cpp_aligned_new)
947*4d6fc14bSjoerg   // We're deferring to Microsoft's STL to provide aligned new et al. We don't
948*4d6fc14bSjoerg   // have it unless the language feature test macro is defined.
949*4d6fc14bSjoerg#  define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
950*4d6fc14bSjoerg#elif defined(__MVS__)
951*4d6fc14bSjoerg#  define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
952*4d6fc14bSjoerg#endif
953*4d6fc14bSjoerg
954*4d6fc14bSjoerg#if defined(__APPLE__)
955*4d6fc14bSjoerg#  if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \
956*4d6fc14bSjoerg      defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
957*4d6fc14bSjoerg#    define __MAC_OS_X_VERSION_MIN_REQUIRED __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
958*4d6fc14bSjoerg#  endif
959*4d6fc14bSjoerg#endif // defined(__APPLE__)
960*4d6fc14bSjoerg
961*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) && \
962*4d6fc14bSjoerg    (defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) || \
963*4d6fc14bSjoerg    (!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606))
964*4d6fc14bSjoerg#  define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
965*4d6fc14bSjoerg#endif
966*4d6fc14bSjoerg
967*4d6fc14bSjoerg#if defined(__APPLE__) || defined(__FreeBSD__)
968*4d6fc14bSjoerg#define _LIBCPP_HAS_DEFAULTRUNELOCALE
969*4d6fc14bSjoerg#endif
970*4d6fc14bSjoerg
971*4d6fc14bSjoerg#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__)
972*4d6fc14bSjoerg#define _LIBCPP_WCTYPE_IS_MASK
973*4d6fc14bSjoerg#endif
974*4d6fc14bSjoerg
975*4d6fc14bSjoerg#if _LIBCPP_STD_VER <= 17 || !defined(__cpp_char8_t)
976*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_CHAR8_T
977*4d6fc14bSjoerg#endif
978*4d6fc14bSjoerg
979*4d6fc14bSjoerg// Deprecation macros.
980*4d6fc14bSjoerg//
981*4d6fc14bSjoerg// Deprecations warnings are always enabled, except when users explicitly opt-out
982*4d6fc14bSjoerg// by defining _LIBCPP_DISABLE_DEPRECATION_WARNINGS.
983*4d6fc14bSjoerg#if !defined(_LIBCPP_DISABLE_DEPRECATION_WARNINGS)
984*4d6fc14bSjoerg#  if __has_attribute(deprecated)
985*4d6fc14bSjoerg#    define _LIBCPP_DEPRECATED __attribute__ ((deprecated))
986*4d6fc14bSjoerg#  elif _LIBCPP_STD_VER > 11
987*4d6fc14bSjoerg#    define _LIBCPP_DEPRECATED [[deprecated]]
988*4d6fc14bSjoerg#  else
989*4d6fc14bSjoerg#    define _LIBCPP_DEPRECATED
990*4d6fc14bSjoerg#  endif
991*4d6fc14bSjoerg#else
992*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED
993*4d6fc14bSjoerg#endif
994*4d6fc14bSjoerg
995*4d6fc14bSjoerg#if !defined(_LIBCPP_CXX03_LANG)
996*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED_IN_CXX11 _LIBCPP_DEPRECATED
997*4d6fc14bSjoerg#else
998*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED_IN_CXX11
999*4d6fc14bSjoerg#endif
1000*4d6fc14bSjoerg
1001*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 14
1002*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED_IN_CXX14 _LIBCPP_DEPRECATED
1003*4d6fc14bSjoerg#else
1004*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED_IN_CXX14
1005*4d6fc14bSjoerg#endif
1006*4d6fc14bSjoerg
1007*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17
1008*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_DEPRECATED
1009*4d6fc14bSjoerg#else
1010*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED_IN_CXX17
1011*4d6fc14bSjoerg#endif
1012*4d6fc14bSjoerg
1013*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
1014*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_DEPRECATED
1015*4d6fc14bSjoerg#else
1016*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED_IN_CXX20
1017*4d6fc14bSjoerg#endif
1018*4d6fc14bSjoerg
1019*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_CHAR8_T)
1020*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED_WITH_CHAR8_T _LIBCPP_DEPRECATED
1021*4d6fc14bSjoerg#else
1022*4d6fc14bSjoerg#  define _LIBCPP_DEPRECATED_WITH_CHAR8_T
1023*4d6fc14bSjoerg#endif
1024*4d6fc14bSjoerg
1025*4d6fc14bSjoerg// Macros to enter and leave a state where deprecation warnings are suppressed.
1026*4d6fc14bSjoerg#if !defined(_LIBCPP_SUPPRESS_DEPRECATED_PUSH) &&                              \
1027*4d6fc14bSjoerg    (defined(_LIBCPP_COMPILER_CLANG_BASED) || defined(_LIBCPP_COMPILER_GCC))
1028*4d6fc14bSjoerg#  define _LIBCPP_SUPPRESS_DEPRECATED_PUSH \
1029*4d6fc14bSjoerg    _Pragma("GCC diagnostic push") \
1030*4d6fc14bSjoerg    _Pragma("GCC diagnostic ignored \"-Wdeprecated\"")
1031*4d6fc14bSjoerg#  define _LIBCPP_SUPPRESS_DEPRECATED_POP \
1032*4d6fc14bSjoerg    _Pragma("GCC diagnostic pop")
1033*4d6fc14bSjoerg#endif
1034*4d6fc14bSjoerg#if !defined(_LIBCPP_SUPPRESS_DEPRECATED_PUSH)
1035*4d6fc14bSjoerg#  define _LIBCPP_SUPPRESS_DEPRECATED_PUSH
1036*4d6fc14bSjoerg#  define _LIBCPP_SUPPRESS_DEPRECATED_POP
1037*4d6fc14bSjoerg#endif
1038*4d6fc14bSjoerg
1039*4d6fc14bSjoerg#if _LIBCPP_STD_VER <= 11
1040*4d6fc14bSjoerg#  define _LIBCPP_EXPLICIT_AFTER_CXX11
1041*4d6fc14bSjoerg#else
1042*4d6fc14bSjoerg#  define _LIBCPP_EXPLICIT_AFTER_CXX11 explicit
1043*4d6fc14bSjoerg#endif
1044*4d6fc14bSjoerg
1045*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
1046*4d6fc14bSjoerg#  define _LIBCPP_CONSTEXPR_AFTER_CXX11 constexpr
1047*4d6fc14bSjoerg#else
1048*4d6fc14bSjoerg#  define _LIBCPP_CONSTEXPR_AFTER_CXX11
1049*4d6fc14bSjoerg#endif
1050*4d6fc14bSjoerg
1051*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
1052*4d6fc14bSjoerg#  define _LIBCPP_CONSTEXPR_AFTER_CXX14 constexpr
1053*4d6fc14bSjoerg#else
1054*4d6fc14bSjoerg#  define _LIBCPP_CONSTEXPR_AFTER_CXX14
1055*4d6fc14bSjoerg#endif
1056*4d6fc14bSjoerg
1057*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
1058*4d6fc14bSjoerg#  define _LIBCPP_CONSTEXPR_AFTER_CXX17 constexpr
1059*4d6fc14bSjoerg#else
1060*4d6fc14bSjoerg#  define _LIBCPP_CONSTEXPR_AFTER_CXX17
1061*4d6fc14bSjoerg#endif
1062*4d6fc14bSjoerg
1063*4d6fc14bSjoerg// The _LIBCPP_NODISCARD_ATTRIBUTE should only be used to define other
1064*4d6fc14bSjoerg// NODISCARD macros to the correct attribute.
1065*4d6fc14bSjoerg#if __has_cpp_attribute(nodiscard) || defined(_LIBCPP_COMPILER_MSVC)
1066*4d6fc14bSjoerg#  define _LIBCPP_NODISCARD_ATTRIBUTE [[nodiscard]]
1067*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_CLANG_BASED) && !defined(_LIBCPP_CXX03_LANG)
1068*4d6fc14bSjoerg#  define _LIBCPP_NODISCARD_ATTRIBUTE [[clang::warn_unused_result]]
1069*4d6fc14bSjoerg#else
1070*4d6fc14bSjoerg// We can't use GCC's [[gnu::warn_unused_result]] and
1071*4d6fc14bSjoerg// __attribute__((warn_unused_result)), because GCC does not silence them via
1072*4d6fc14bSjoerg// (void) cast.
1073*4d6fc14bSjoerg#  define _LIBCPP_NODISCARD_ATTRIBUTE
1074*4d6fc14bSjoerg#endif
1075*4d6fc14bSjoerg
1076*4d6fc14bSjoerg// _LIBCPP_NODISCARD_EXT may be used to apply [[nodiscard]] to entities not
1077*4d6fc14bSjoerg// specified as such as an extension.
1078*4d6fc14bSjoerg#if defined(_LIBCPP_ENABLE_NODISCARD) && !defined(_LIBCPP_DISABLE_NODISCARD_EXT)
1079*4d6fc14bSjoerg#  define _LIBCPP_NODISCARD_EXT _LIBCPP_NODISCARD_ATTRIBUTE
1080*4d6fc14bSjoerg#else
1081*4d6fc14bSjoerg#  define _LIBCPP_NODISCARD_EXT
1082*4d6fc14bSjoerg#endif
1083*4d6fc14bSjoerg
1084*4d6fc14bSjoerg#if !defined(_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17) && \
1085*4d6fc14bSjoerg    (_LIBCPP_STD_VER > 17 || defined(_LIBCPP_ENABLE_NODISCARD))
1086*4d6fc14bSjoerg#  define _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_NODISCARD_ATTRIBUTE
1087*4d6fc14bSjoerg#else
1088*4d6fc14bSjoerg#  define _LIBCPP_NODISCARD_AFTER_CXX17
1089*4d6fc14bSjoerg#endif
1090*4d6fc14bSjoerg
1091*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 && defined(__cpp_inline_variables) && (__cpp_inline_variables >= 201606L)
1092*4d6fc14bSjoerg#  define _LIBCPP_INLINE_VAR inline
1093*4d6fc14bSjoerg#else
1094*4d6fc14bSjoerg#  define _LIBCPP_INLINE_VAR
1095*4d6fc14bSjoerg#endif
1096*4d6fc14bSjoerg
1097*4d6fc14bSjoerg#ifndef _LIBCPP_CONSTEXPR_IF_NODEBUG
1098*4d6fc14bSjoerg#if defined(_LIBCPP_DEBUG) || defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
1099*4d6fc14bSjoerg#define _LIBCPP_CONSTEXPR_IF_NODEBUG
1100*4d6fc14bSjoerg#else
1101*4d6fc14bSjoerg#define _LIBCPP_CONSTEXPR_IF_NODEBUG constexpr
1102*4d6fc14bSjoerg#endif
1103*4d6fc14bSjoerg#endif
1104*4d6fc14bSjoerg
1105*4d6fc14bSjoerg#if __has_attribute(no_destroy)
1106*4d6fc14bSjoerg#  define _LIBCPP_NO_DESTROY __attribute__((__no_destroy__))
1107*4d6fc14bSjoerg#else
1108*4d6fc14bSjoerg#  define _LIBCPP_NO_DESTROY
1109*4d6fc14bSjoerg#endif
1110*4d6fc14bSjoerg
1111*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_ASAN
1112*4d6fc14bSjoergextern "C" _LIBCPP_FUNC_VIS void __sanitizer_annotate_contiguous_container(
1113*4d6fc14bSjoerg  const void *, const void *, const void *, const void *);
1114*4d6fc14bSjoerg#endif
1115*4d6fc14bSjoerg
1116*4d6fc14bSjoerg// Try to find out if RTTI is disabled.
1117*4d6fc14bSjoerg#if defined(_LIBCPP_COMPILER_CLANG_BASED) && !__has_feature(cxx_rtti)
1118*4d6fc14bSjoerg#  define _LIBCPP_NO_RTTI
1119*4d6fc14bSjoerg#elif defined(__GNUC__) && !defined(__GXX_RTTI)
1120*4d6fc14bSjoerg#  define _LIBCPP_NO_RTTI
1121*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_MSVC) && !defined(_CPPRTTI)
1122*4d6fc14bSjoerg#  define _LIBCPP_NO_RTTI
1123*4d6fc14bSjoerg#endif
1124*4d6fc14bSjoerg
1125*4d6fc14bSjoerg#ifndef _LIBCPP_WEAK
1126*4d6fc14bSjoerg#define _LIBCPP_WEAK __attribute__((__weak__))
1127*4d6fc14bSjoerg#endif
1128*4d6fc14bSjoerg
1129*4d6fc14bSjoerg// Thread API
1130*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_THREADS) && \
1131*4d6fc14bSjoerg    !defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && \
1132*4d6fc14bSjoerg    !defined(_LIBCPP_HAS_THREAD_API_WIN32) && \
1133*4d6fc14bSjoerg    !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
1134*4d6fc14bSjoerg#  if defined(__FreeBSD__) || \
1135*4d6fc14bSjoerg      defined(__wasi__) || \
1136*4d6fc14bSjoerg      defined(__NetBSD__) || \
1137*4d6fc14bSjoerg      defined(__OpenBSD__) || \
1138*4d6fc14bSjoerg      defined(__NuttX__) || \
1139*4d6fc14bSjoerg      defined(__linux__) || \
1140*4d6fc14bSjoerg      defined(__GNU__) || \
1141*4d6fc14bSjoerg      defined(__APPLE__) || \
1142*4d6fc14bSjoerg      defined(__CloudABI__) || \
1143*4d6fc14bSjoerg      defined(__sun__) || \
1144*4d6fc14bSjoerg      defined(__MVS__) || \
1145*4d6fc14bSjoerg      defined(_AIX) || \
1146*4d6fc14bSjoerg      (defined(__MINGW32__) && __has_include(<pthread.h>))
1147*4d6fc14bSjoerg#    define _LIBCPP_HAS_THREAD_API_PTHREAD
1148*4d6fc14bSjoerg#  elif defined(__Fuchsia__)
1149*4d6fc14bSjoerg     // TODO(44575): Switch to C11 thread API when possible.
1150*4d6fc14bSjoerg#    define _LIBCPP_HAS_THREAD_API_PTHREAD
1151*4d6fc14bSjoerg#  elif defined(_LIBCPP_WIN32API)
1152*4d6fc14bSjoerg#    define _LIBCPP_HAS_THREAD_API_WIN32
1153*4d6fc14bSjoerg#  else
1154*4d6fc14bSjoerg#    error "No thread API"
1155*4d6fc14bSjoerg#  endif // _LIBCPP_HAS_THREAD_API
1156*4d6fc14bSjoerg#endif // _LIBCPP_HAS_NO_THREADS
1157*4d6fc14bSjoerg
1158*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
1159*4d6fc14bSjoerg#if defined(__ANDROID__) && __ANDROID_API__ >= 30
1160*4d6fc14bSjoerg#define _LIBCPP_HAS_COND_CLOCKWAIT
1161*4d6fc14bSjoerg#elif defined(_LIBCPP_GLIBC_PREREQ)
1162*4d6fc14bSjoerg#if _LIBCPP_GLIBC_PREREQ(2, 30)
1163*4d6fc14bSjoerg#define _LIBCPP_HAS_COND_CLOCKWAIT
1164*4d6fc14bSjoerg#endif
1165*4d6fc14bSjoerg#endif
1166*4d6fc14bSjoerg#endif
1167*4d6fc14bSjoerg
1168*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
1169*4d6fc14bSjoerg#error _LIBCPP_HAS_THREAD_API_PTHREAD may only be defined when \
1170*4d6fc14bSjoerg       _LIBCPP_HAS_NO_THREADS is not defined.
1171*4d6fc14bSjoerg#endif
1172*4d6fc14bSjoerg
1173*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
1174*4d6fc14bSjoerg#error _LIBCPP_HAS_THREAD_API_EXTERNAL may not be defined when \
1175*4d6fc14bSjoerg       _LIBCPP_HAS_NO_THREADS is defined.
1176*4d6fc14bSjoerg#endif
1177*4d6fc14bSjoerg
1178*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(_LIBCPP_HAS_NO_THREADS)
1179*4d6fc14bSjoerg#error _LIBCPP_HAS_NO_MONOTONIC_CLOCK may only be defined when \
1180*4d6fc14bSjoerg       _LIBCPP_HAS_NO_THREADS is defined.
1181*4d6fc14bSjoerg#endif
1182*4d6fc14bSjoerg
1183*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_THREADS) && !defined(__STDCPP_THREADS__)
1184*4d6fc14bSjoerg#define __STDCPP_THREADS__ 1
1185*4d6fc14bSjoerg#endif
1186*4d6fc14bSjoerg
1187*4d6fc14bSjoerg// The glibc and Bionic implementation of pthreads implements
1188*4d6fc14bSjoerg// pthread_mutex_destroy as nop for regular mutexes. Additionally, Win32
1189*4d6fc14bSjoerg// mutexes have no destroy mechanism.
1190*4d6fc14bSjoerg//
1191*4d6fc14bSjoerg// This optimization can't be performed on Apple platforms, where
1192*4d6fc14bSjoerg// pthread_mutex_destroy can allow the kernel to release resources.
1193*4d6fc14bSjoerg// See https://llvm.org/D64298 for details.
1194*4d6fc14bSjoerg//
1195*4d6fc14bSjoerg// TODO(EricWF): Enable this optimization on Bionic after speaking to their
1196*4d6fc14bSjoerg//               respective stakeholders.
1197*4d6fc14bSjoerg#if (defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && defined(__GLIBC__)) \
1198*4d6fc14bSjoerg  || (defined(_LIBCPP_HAS_THREAD_API_C11) && defined(__Fuchsia__)) \
1199*4d6fc14bSjoerg  || defined(_LIBCPP_HAS_THREAD_API_WIN32)
1200*4d6fc14bSjoerg# define _LIBCPP_HAS_TRIVIAL_MUTEX_DESTRUCTION
1201*4d6fc14bSjoerg#endif
1202*4d6fc14bSjoerg
1203*4d6fc14bSjoerg// Destroying a condvar is a nop on Windows.
1204*4d6fc14bSjoerg//
1205*4d6fc14bSjoerg// This optimization can't be performed on Apple platforms, where
1206*4d6fc14bSjoerg// pthread_cond_destroy can allow the kernel to release resources.
1207*4d6fc14bSjoerg// See https://llvm.org/D64298 for details.
1208*4d6fc14bSjoerg//
1209*4d6fc14bSjoerg// TODO(EricWF): This is potentially true for some pthread implementations
1210*4d6fc14bSjoerg// as well.
1211*4d6fc14bSjoerg#if (defined(_LIBCPP_HAS_THREAD_API_C11) && defined(__Fuchsia__)) || \
1212*4d6fc14bSjoerg     defined(_LIBCPP_HAS_THREAD_API_WIN32)
1213*4d6fc14bSjoerg# define _LIBCPP_HAS_TRIVIAL_CONDVAR_DESTRUCTION
1214*4d6fc14bSjoerg#endif
1215*4d6fc14bSjoerg
1216*4d6fc14bSjoerg// Systems that use capability-based security (FreeBSD with Capsicum,
1217*4d6fc14bSjoerg// Nuxi CloudABI) may only provide local filesystem access (using *at()).
1218*4d6fc14bSjoerg// Functions like open(), rename(), unlink() and stat() should not be
1219*4d6fc14bSjoerg// used, as they attempt to access the global filesystem namespace.
1220*4d6fc14bSjoerg#ifdef __CloudABI__
1221*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1222*4d6fc14bSjoerg#endif
1223*4d6fc14bSjoerg
1224*4d6fc14bSjoerg// CloudABI is intended for running networked services. Processes do not
1225*4d6fc14bSjoerg// have standard input and output channels.
1226*4d6fc14bSjoerg#ifdef __CloudABI__
1227*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_STDIN
1228*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_STDOUT
1229*4d6fc14bSjoerg#endif
1230*4d6fc14bSjoerg
1231*4d6fc14bSjoerg// Some systems do not provide gets() in their C library, for security reasons.
1232*4d6fc14bSjoerg#ifndef _LIBCPP_C_HAS_NO_GETS
1233*4d6fc14bSjoerg#  if defined(_LIBCPP_MSVCRT) || \
1234*4d6fc14bSjoerg      (defined(__FreeBSD_version) && __FreeBSD_version >= 1300043) || \
1235*4d6fc14bSjoerg      defined(__OpenBSD__)
1236*4d6fc14bSjoerg#    define _LIBCPP_C_HAS_NO_GETS
1237*4d6fc14bSjoerg#  endif
1238*4d6fc14bSjoerg#endif
1239*4d6fc14bSjoerg
1240*4d6fc14bSjoerg#if defined(__BIONIC__) || defined(__CloudABI__) || defined(__NuttX__) ||      \
1241*4d6fc14bSjoerg    defined(__Fuchsia__) || defined(__wasi__) || defined(_LIBCPP_HAS_MUSL_LIBC) || \
1242*4d6fc14bSjoerg    defined(__MVS__) || defined(__OpenBSD__)
1243*4d6fc14bSjoerg#define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
1244*4d6fc14bSjoerg#endif
1245*4d6fc14bSjoerg
1246*4d6fc14bSjoerg// Thread-unsafe functions such as strtok() and localtime()
1247*4d6fc14bSjoerg// are not available.
1248*4d6fc14bSjoerg#ifdef __CloudABI__
1249*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
1250*4d6fc14bSjoerg#endif
1251*4d6fc14bSjoerg
1252*4d6fc14bSjoerg#if __has_feature(cxx_atomic) || __has_extension(c_atomic) || __has_keyword(_Atomic)
1253*4d6fc14bSjoerg#  define _LIBCPP_HAS_C_ATOMIC_IMP
1254*4d6fc14bSjoerg#elif defined(_LIBCPP_COMPILER_GCC)
1255*4d6fc14bSjoerg#  define _LIBCPP_HAS_GCC_ATOMIC_IMP
1256*4d6fc14bSjoerg#endif
1257*4d6fc14bSjoerg
1258*4d6fc14bSjoerg#if (!defined(_LIBCPP_HAS_C_ATOMIC_IMP) && \
1259*4d6fc14bSjoerg     !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP) && \
1260*4d6fc14bSjoerg     !defined(_LIBCPP_HAS_EXTERNAL_ATOMIC_IMP)) \
1261*4d6fc14bSjoerg     || defined(_LIBCPP_HAS_NO_THREADS)
1262*4d6fc14bSjoerg#  define _LIBCPP_HAS_NO_ATOMIC_HEADER
1263*4d6fc14bSjoerg#else
1264*4d6fc14bSjoerg#  ifndef _LIBCPP_ATOMIC_FLAG_TYPE
1265*4d6fc14bSjoerg#    define _LIBCPP_ATOMIC_FLAG_TYPE bool
1266*4d6fc14bSjoerg#  endif
1267*4d6fc14bSjoerg#  ifdef _LIBCPP_FREESTANDING
1268*4d6fc14bSjoerg#    define _LIBCPP_ATOMIC_ONLY_USE_BUILTINS
1269*4d6fc14bSjoerg#  endif
1270*4d6fc14bSjoerg#endif
1271*4d6fc14bSjoerg
1272*4d6fc14bSjoerg#ifndef _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
1273*4d6fc14bSjoerg#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
1274*4d6fc14bSjoerg#endif
1275*4d6fc14bSjoerg
1276*4d6fc14bSjoerg#if defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS)
1277*4d6fc14bSjoerg#  if defined(__clang__) && __has_attribute(acquire_capability)
1278*4d6fc14bSjoerg// Work around the attribute handling in clang.  When both __declspec and
1279*4d6fc14bSjoerg// __attribute__ are present, the processing goes awry preventing the definition
1280*4d6fc14bSjoerg// of the types.
1281*4d6fc14bSjoerg#    if !defined(_LIBCPP_OBJECT_FORMAT_COFF)
1282*4d6fc14bSjoerg#      define _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS
1283*4d6fc14bSjoerg#    endif
1284*4d6fc14bSjoerg#  endif
1285*4d6fc14bSjoerg#endif
1286*4d6fc14bSjoerg
1287*4d6fc14bSjoerg#ifndef _LIBCPP_THREAD_SAFETY_ANNOTATION
1288*4d6fc14bSjoerg#  ifdef _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS
1289*4d6fc14bSjoerg#    define _LIBCPP_THREAD_SAFETY_ANNOTATION(x) __attribute__((x))
1290*4d6fc14bSjoerg#  else
1291*4d6fc14bSjoerg#    define _LIBCPP_THREAD_SAFETY_ANNOTATION(x)
1292*4d6fc14bSjoerg#  endif
1293*4d6fc14bSjoerg#endif // _LIBCPP_THREAD_SAFETY_ANNOTATION
1294*4d6fc14bSjoerg
1295*4d6fc14bSjoerg#if __has_attribute(require_constant_initialization)
1296*4d6fc14bSjoerg#  define _LIBCPP_SAFE_STATIC __attribute__((__require_constant_initialization__))
1297*4d6fc14bSjoerg#else
1298*4d6fc14bSjoerg#  define _LIBCPP_SAFE_STATIC
1299*4d6fc14bSjoerg#endif
1300*4d6fc14bSjoerg
1301*4d6fc14bSjoerg#if !__has_builtin(__builtin_addressof) && _GNUC_VER < 700
1302*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
1303*4d6fc14bSjoerg#endif
1304*4d6fc14bSjoerg
1305*4d6fc14bSjoerg#if !__has_builtin(__builtin_is_constant_evaluated) && _GNUC_VER < 900
1306*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED
1307*4d6fc14bSjoerg#endif
1308*4d6fc14bSjoerg
1309*4d6fc14bSjoerg#if __has_attribute(diagnose_if) && !defined(_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS)
1310*4d6fc14bSjoerg#  define _LIBCPP_DIAGNOSE_WARNING(...) \
1311*4d6fc14bSjoerg     __attribute__((diagnose_if(__VA_ARGS__, "warning")))
1312*4d6fc14bSjoerg#  define _LIBCPP_DIAGNOSE_ERROR(...) \
1313*4d6fc14bSjoerg     __attribute__((diagnose_if(__VA_ARGS__, "error")))
1314*4d6fc14bSjoerg#else
1315*4d6fc14bSjoerg#  define _LIBCPP_DIAGNOSE_WARNING(...)
1316*4d6fc14bSjoerg#  define _LIBCPP_DIAGNOSE_ERROR(...)
1317*4d6fc14bSjoerg#endif
1318*4d6fc14bSjoerg
1319*4d6fc14bSjoerg// Use a function like macro to imply that it must be followed by a semicolon
1320*4d6fc14bSjoerg#if __cplusplus > 201402L && __has_cpp_attribute(fallthrough)
1321*4d6fc14bSjoerg#  define _LIBCPP_FALLTHROUGH() [[fallthrough]]
1322*4d6fc14bSjoerg#elif __has_cpp_attribute(clang::fallthrough)
1323*4d6fc14bSjoerg#  define _LIBCPP_FALLTHROUGH() [[clang::fallthrough]]
1324*4d6fc14bSjoerg#elif __has_attribute(fallthrough) || _GNUC_VER >= 700
1325*4d6fc14bSjoerg#  define _LIBCPP_FALLTHROUGH() __attribute__((__fallthrough__))
1326*4d6fc14bSjoerg#else
1327*4d6fc14bSjoerg#  define _LIBCPP_FALLTHROUGH() ((void)0)
1328*4d6fc14bSjoerg#endif
1329*4d6fc14bSjoerg
1330*4d6fc14bSjoerg#if __has_attribute(__nodebug__)
1331*4d6fc14bSjoerg#define _LIBCPP_NODEBUG __attribute__((__nodebug__))
1332*4d6fc14bSjoerg#else
1333*4d6fc14bSjoerg#define _LIBCPP_NODEBUG
1334*4d6fc14bSjoerg#endif
1335*4d6fc14bSjoerg
1336*4d6fc14bSjoerg#ifndef _LIBCPP_NODEBUG_TYPE
1337*4d6fc14bSjoerg#if __has_attribute(__nodebug__) && \
1338*4d6fc14bSjoerg    (defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER >= 900)
1339*4d6fc14bSjoerg#define _LIBCPP_NODEBUG_TYPE __attribute__((nodebug))
1340*4d6fc14bSjoerg#else
1341*4d6fc14bSjoerg#define _LIBCPP_NODEBUG_TYPE
1342*4d6fc14bSjoerg#endif
1343*4d6fc14bSjoerg#endif // !defined(_LIBCPP_NODEBUG_TYPE)
1344*4d6fc14bSjoerg
1345*4d6fc14bSjoerg#if __has_attribute(__standalone_debug__)
1346*4d6fc14bSjoerg#define _LIBCPP_STANDALONE_DEBUG __attribute__((__standalone_debug__))
1347*4d6fc14bSjoerg#else
1348*4d6fc14bSjoerg#define _LIBCPP_STANDALONE_DEBUG
1349*4d6fc14bSjoerg#endif
1350*4d6fc14bSjoerg
1351*4d6fc14bSjoerg#if __has_attribute(__preferred_name__)
1352*4d6fc14bSjoerg#define _LIBCPP_PREFERRED_NAME(x) __attribute__((__preferred_name__(x)))
1353*4d6fc14bSjoerg#else
1354*4d6fc14bSjoerg#define _LIBCPP_PREFERRED_NAME(x)
1355*4d6fc14bSjoerg#endif
1356*4d6fc14bSjoerg
1357*4d6fc14bSjoerg#if defined(_LIBCPP_ABI_MICROSOFT) && \
1358*4d6fc14bSjoerg    (defined(_LIBCPP_COMPILER_MSVC) || __has_declspec_attribute(empty_bases))
1359*4d6fc14bSjoerg#  define _LIBCPP_DECLSPEC_EMPTY_BASES __declspec(empty_bases)
1360*4d6fc14bSjoerg#else
1361*4d6fc14bSjoerg#  define _LIBCPP_DECLSPEC_EMPTY_BASES
1362*4d6fc14bSjoerg#endif
1363*4d6fc14bSjoerg
1364*4d6fc14bSjoerg#if defined(_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES)
1365*4d6fc14bSjoerg#define _LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR
1366*4d6fc14bSjoerg#define _LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS
1367*4d6fc14bSjoerg#define _LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE
1368*4d6fc14bSjoerg#define _LIBCPP_ENABLE_CXX17_REMOVED_BINDERS
1369*4d6fc14bSjoerg#endif // _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES
1370*4d6fc14bSjoerg
1371*4d6fc14bSjoerg#if !defined(__cpp_deduction_guides) || __cpp_deduction_guides < 201611
1372*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_DEDUCTION_GUIDES
1373*4d6fc14bSjoerg#endif
1374*4d6fc14bSjoerg
1375*4d6fc14bSjoerg#if !__has_keyword(__is_aggregate) && (_GNUC_VER_NEW < 7001)
1376*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_IS_AGGREGATE
1377*4d6fc14bSjoerg#endif
1378*4d6fc14bSjoerg
1379*4d6fc14bSjoerg#if !defined(__cpp_coroutines) || __cpp_coroutines < 201703L
1380*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_COROUTINES
1381*4d6fc14bSjoerg#endif
1382*4d6fc14bSjoerg
1383*4d6fc14bSjoerg#if !defined(__cpp_impl_three_way_comparison) || __cpp_impl_three_way_comparison < 201907L
1384*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
1385*4d6fc14bSjoerg#endif
1386*4d6fc14bSjoerg
1387*4d6fc14bSjoerg#if defined(_LIBCPP_COMPILER_IBM)
1388*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO
1389*4d6fc14bSjoerg#endif
1390*4d6fc14bSjoerg
1391*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO)
1392*4d6fc14bSjoerg#  define _LIBCPP_PUSH_MACROS
1393*4d6fc14bSjoerg#  define _LIBCPP_POP_MACROS
1394*4d6fc14bSjoerg#else
1395*4d6fc14bSjoerg  // Don't warn about macro conflicts when we can restore them at the
1396*4d6fc14bSjoerg  // end of the header.
1397*4d6fc14bSjoerg#  ifndef _LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS
1398*4d6fc14bSjoerg#    define _LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS
1399*4d6fc14bSjoerg#  endif
1400*4d6fc14bSjoerg#  if defined(_LIBCPP_COMPILER_MSVC)
1401*4d6fc14bSjoerg#    define _LIBCPP_PUSH_MACROS    \
1402*4d6fc14bSjoerg       __pragma(push_macro("min")) \
1403*4d6fc14bSjoerg       __pragma(push_macro("max"))
1404*4d6fc14bSjoerg#    define _LIBCPP_POP_MACROS     \
1405*4d6fc14bSjoerg       __pragma(pop_macro("min"))  \
1406*4d6fc14bSjoerg       __pragma(pop_macro("max"))
1407*4d6fc14bSjoerg#  else
1408*4d6fc14bSjoerg#    define _LIBCPP_PUSH_MACROS        \
1409*4d6fc14bSjoerg       _Pragma("push_macro(\"min\")")  \
1410*4d6fc14bSjoerg       _Pragma("push_macro(\"max\")")
1411*4d6fc14bSjoerg#    define _LIBCPP_POP_MACROS         \
1412*4d6fc14bSjoerg       _Pragma("pop_macro(\"min\")")   \
1413*4d6fc14bSjoerg       _Pragma("pop_macro(\"max\")")
1414*4d6fc14bSjoerg#  endif
1415*4d6fc14bSjoerg#endif // defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO)
1416*4d6fc14bSjoerg
1417*4d6fc14bSjoerg#ifndef _LIBCPP_NO_AUTO_LINK
1418*4d6fc14bSjoerg#  if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY)
1419*4d6fc14bSjoerg#    if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
1420*4d6fc14bSjoerg#      pragma comment(lib, "c++.lib")
1421*4d6fc14bSjoerg#    else
1422*4d6fc14bSjoerg#      pragma comment(lib, "libc++.lib")
1423*4d6fc14bSjoerg#    endif
1424*4d6fc14bSjoerg#  endif // defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY)
1425*4d6fc14bSjoerg#endif // _LIBCPP_NO_AUTO_LINK
1426*4d6fc14bSjoerg
1427*4d6fc14bSjoerg// Configures the fopen close-on-exec mode character, if any. This string will
1428*4d6fc14bSjoerg// be appended to any mode string used by fstream for fopen/fdopen.
1429*4d6fc14bSjoerg//
1430*4d6fc14bSjoerg// Not all platforms support this, but it helps avoid fd-leaks on platforms that
1431*4d6fc14bSjoerg// do.
1432*4d6fc14bSjoerg#if defined(__BIONIC__)
1433*4d6fc14bSjoerg#  define _LIBCPP_FOPEN_CLOEXEC_MODE "e"
1434*4d6fc14bSjoerg#else
1435*4d6fc14bSjoerg#  define _LIBCPP_FOPEN_CLOEXEC_MODE
1436*4d6fc14bSjoerg#endif
1437*4d6fc14bSjoerg
1438*4d6fc14bSjoerg#ifdef _LIBCPP_COMPILER_HAS_BUILTIN_CONSTANT_P
1439*4d6fc14bSjoerg#define _LIBCPP_BUILTIN_CONSTANT_P(x) __builtin_constant_p(x)
1440*4d6fc14bSjoerg#else
1441*4d6fc14bSjoerg#define _LIBCPP_BUILTIN_CONSTANT_P(x) false
1442*4d6fc14bSjoerg#endif
1443*4d6fc14bSjoerg
1444*4d6fc14bSjoerg// Support for _FILE_OFFSET_BITS=64 landed gradually in Android, so the full set
1445*4d6fc14bSjoerg// of functions used in cstdio may not be available for low API levels when
1446*4d6fc14bSjoerg// using 64-bit file offsets on LP32.
1447*4d6fc14bSjoerg#if defined(__BIONIC__) && defined(__USE_FILE_OFFSET64) && __ANDROID_API__ < 24
1448*4d6fc14bSjoerg#define _LIBCPP_HAS_NO_FGETPOS_FSETPOS
1449*4d6fc14bSjoerg#endif
1450*4d6fc14bSjoerg
1451*4d6fc14bSjoerg#if __has_attribute(init_priority)
1452*4d6fc14bSjoerg# define _LIBCPP_INIT_PRIORITY_MAX __attribute__((init_priority(101)))
1453*4d6fc14bSjoerg#else
1454*4d6fc14bSjoerg# define _LIBCPP_INIT_PRIORITY_MAX
1455*4d6fc14bSjoerg#endif
1456*4d6fc14bSjoerg
1457*4d6fc14bSjoerg#if defined(__GNUC__) || defined(__clang__)
1458*4d6fc14bSjoerg#define _LIBCPP_FORMAT_PRINTF(a, b)                                            \
1459*4d6fc14bSjoerg  __attribute__((__format__(__printf__, a, b)))
1460*4d6fc14bSjoerg#else
1461*4d6fc14bSjoerg#define _LIBCPP_FORMAT_PRINTF(a, b)
1462*4d6fc14bSjoerg#endif
1463*4d6fc14bSjoerg
1464*4d6fc14bSjoerg#endif // __cplusplus
1465*4d6fc14bSjoerg
1466*4d6fc14bSjoerg#endif // _LIBCPP_CONFIG
1467