aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/cxxsupp/libcxx/include/__availability
blob: 579698ec1e932ffef196b1aacd3e1660c1a67df7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP___AVAILABILITY
#define _LIBCPP___AVAILABILITY

#include <__config>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#  pragma GCC system_header
#endif

// Libc++ is shipped by various vendors. In particular, it is used as a system
// library on macOS, iOS and other Apple platforms. In order for users to be
// able to compile a binary that is intended to be deployed to an older version
// of a platform, Clang provides availability attributes [1]. These attributes
// can be placed on declarations and are used to describe the life cycle of a
// symbol in the library.
//
// The main goal is to ensure a compile-time error if a symbol that hasn't been
// introduced in a previously released library is used in a program that targets
// that previously released library. Normally, this would be a load-time error
// when one tries to launch the program against the older library.
//
// For example, the filesystem library was introduced in the dylib in macOS 10.15.
// If a user compiles on a macOS 10.15 host but targets macOS 10.13 with their
// program, the compiler would normally not complain (because the required
// declarations are in the headers), but the dynamic loader would fail to find
// the symbols when actually trying to launch the program on macOS 10.13. To
// turn this into a compile-time issue instead, declarations are annotated with
// when they were introduced, and the compiler can produce a diagnostic if the
// program references something that isn't available on the deployment target.
//
// This mechanism is general in nature, and any vendor can add their markup to
// the library (see below). Whenever a new feature is added that requires support
// in the shared library, two macros are added below to allow marking the feature
// as unavailable:
// 1. A macro named `_LIBCPP_AVAILABILITY_HAS_NO_<feature>` which must be defined
//    exactly when compiling for a target that doesn't support the feature.
// 2. A macro named `_LIBCPP_AVAILABILITY_<feature>`, which must always be defined
//    and must expand to the proper availability attribute for the platform.
//
// When vendors decide to ship the feature as part of their shared library, they
// can update these macros appropriately for their platform, and the library will
// use those to provide an optimal user experience.
//
// Furthermore, many features in the standard library have corresponding
// feature-test macros. The `_LIBCPP_AVAILABILITY_HAS_NO_<feature>` macros
// are checked by the corresponding feature-test macros generated by
// generate_feature_test_macro_components.py to ensure that the library
// doesn't announce a feature as being implemented if it is unavailable on
// the deployment target.
//
// Note that this mechanism is disabled by default in the "upstream" libc++.
// Availability annotations are only meaningful when shipping libc++ inside
// a platform (i.e. as a system library), and so vendors that want them should
// turn those annotations on at CMake configuration time.
//
// [1]: https://clang.llvm.org/docs/AttributeReference.html#availability


// For backwards compatibility, allow users to define _LIBCPP_DISABLE_AVAILABILITY
// for a while.
#if defined(_LIBCPP_DISABLE_AVAILABILITY)
#   if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
#       define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS
#   endif
#endif

// Availability markup is disabled when building the library, or when the compiler
// doesn't support the proper attributes.
#if defined(_LIBCPP_BUILDING_LIBRARY) ||                                        \
    defined(_LIBCXXABI_BUILDING_LIBRARY) ||                                     \
    !__has_feature(attribute_availability_with_strict) ||                       \
    !__has_feature(attribute_availability_in_templates) ||                      \
    !__has_extension(pragma_clang_attribute_external_declaration)
#   if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
#       define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS
#   endif
#endif

#if defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)

    // This controls the availability of std::shared_mutex and std::shared_timed_mutex,
    // which were added to the dylib later.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_SHARED_MUTEX
#   define _LIBCPP_AVAILABILITY_SHARED_MUTEX

    // These macros control the availability of std::bad_optional_access and
    // other exception types. These were put in the shared library to prevent
    // code bloat from every user program defining the vtable for these exception
    // types.
    //
    // Note that when exceptions are disabled, the methods that normally throw
    // these exceptions can be used even on older deployment targets, but those
    // methods will abort instead of throwing.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_BAD_OPTIONAL_ACCESS
#   define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS

// #   define _LIBCPP_AVAILABILITY_HAS_NO_BAD_VARIANT_ACCESS
#   define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS

// #   define _LIBCPP_AVAILABILITY_HAS_NO_BAD_ANY_CAST
#   define _LIBCPP_AVAILABILITY_BAD_ANY_CAST

    // This controls the availability of std::uncaught_exceptions().
// #   define _LIBCPP_AVAILABILITY_HAS_NO_UNCAUGHT_EXCEPTIONS
#   define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS

    // This controls the availability of the sized version of ::operator delete,
    // ::operator delete[], and their align_val_t variants, which were all added
    // in C++17, and hence not present in early dylibs.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_SIZED_NEW_DELETE
#   define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE

    // This controls the availability of the std::future_error exception.
    //
    // Note that when exceptions are disabled, the methods that normally throw
    // std::future_error can be used even on older deployment targets, but those
    // methods will abort instead of throwing.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_FUTURE_ERROR
#   define _LIBCPP_AVAILABILITY_FUTURE_ERROR

    // This controls the availability of std::type_info's vtable.
    // I can't imagine how using std::type_info can work at all if
    // this isn't supported.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_TYPEINFO_VTABLE
#   define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE

    // This controls the availability of std::locale::category members
    // (e.g. std::locale::collate), which are defined in the dylib.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_LOCALE_CATEGORY
#   define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY

    // This controls the availability of atomic operations on std::shared_ptr
    // (e.g. `std::atomic_store(std::shared_ptr)`), which require a shared
    // lock table located in the dylib.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_ATOMIC_SHARED_PTR
#   define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR

    // These macros control the availability of all parts of <filesystem> that
    // depend on something in the dylib.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_FILESYSTEM_LIBRARY
#   define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY
#   define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH
#   define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP

    // This controls the availability of floating-point std::to_chars functions.
    // These overloads were added later than the integer overloads.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_TO_CHARS_FLOATING_POINT
#   define _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT

    // This controls the availability of the C++20 synchronization library,
    // which requires shared library support for various operations
    // (see libcxx/src/atomic.cpp). This includes <barier>, <latch>,
    // <semaphore>, and notification functions on std::atomic.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_SYNC
#   define _LIBCPP_AVAILABILITY_SYNC

    // This controls whether the library claims to provide a default verbose
    // termination function, and consequently whether the headers will try
    // to use it when the mechanism isn't overriden at compile-time.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_VERBOSE_ABORT
#   define _LIBCPP_AVAILABILITY_VERBOSE_ABORT

    // This controls the availability of the C++17 std::pmr library,
    // which is implemented in large part in the built library.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_PMR
#   define _LIBCPP_AVAILABILITY_PMR

    // This controls the availability of the C++20 time zone database.
    // The parser code is built in the library.
// #   define _LIBCPP_AVAILABILITY_HAS_NO_TZDB
#   define _LIBCPP_AVAILABILITY_TZDB

#elif defined(__APPLE__)

    // shared_mutex and shared_timed_mutex
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 100000) || \
        (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 100000) ||         \
        (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 30000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_SHARED_MUTEX
#   endif
#   define _LIBCPP_AVAILABILITY_SHARED_MUTEX                                    \
        __attribute__((availability(macos,strict,introduced=10.12)))            \
        __attribute__((availability(ios,strict,introduced=10.0)))               \
        __attribute__((availability(tvos,strict,introduced=10.0)))              \
        __attribute__((availability(watchos,strict,introduced=3.0)))

        // bad_optional_access, bad_variant_access and bad_any_cast
        // Note: bad_optional_access & friends were not introduced in the matching
        // macOS and iOS versions, so the version mismatch between macOS and others
        // is intended.
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101300) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 120000) || \
        (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 120000) ||         \
        (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 50000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_BAD_OPTIONAL_ACCESS
#       define _LIBCPP_AVAILABILITY_HAS_NO_BAD_VARIANT_ACCESS
#       define _LIBCPP_AVAILABILITY_HAS_NO_BAD_ANY_CAST
#   endif
#   define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS                             \
        __attribute__((availability(macos,strict,introduced=10.13)))            \
        __attribute__((availability(ios,strict,introduced=12.0)))               \
        __attribute__((availability(tvos,strict,introduced=12.0)))              \
        __attribute__((availability(watchos,strict,introduced=5.0)))
#   define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS                              \
        _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
#   define _LIBCPP_AVAILABILITY_BAD_ANY_CAST                                    \
        _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS

    // uncaught_exceptions
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 100000) || \
        (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 100000) ||         \
        (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 30000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_UNCAUGHT_EXCEPTIONS
#   endif
#   define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS                             \
        __attribute__((availability(macos,strict,introduced=10.12)))            \
        __attribute__((availability(ios,strict,introduced=10.0)))               \
        __attribute__((availability(tvos,strict,introduced=10.0)))              \
        __attribute__((availability(watchos,strict,introduced=3.0)))

    // sized operator new and sized operator delete
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 100000) || \
        (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 100000) ||         \
        (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 30000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_SIZED_NEW_DELETE
#   endif
#   define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE                                \
        __attribute__((availability(macos,strict,introduced=10.12)))            \
        __attribute__((availability(ios,strict,introduced=10.0)))               \
        __attribute__((availability(tvos,strict,introduced=10.0)))              \
        __attribute__((availability(watchos,strict,introduced=3.0)))

    // future_error
#   if (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 60000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_FUTURE_ERROR
#   endif
#   define _LIBCPP_AVAILABILITY_FUTURE_ERROR                                    \
        __attribute__((availability(ios,strict,introduced=6.0)))

    // type_info's vtable
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 100900) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 70000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_TYPEINFO_VTABLE
#   endif
#   define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE                                 \
        __attribute__((availability(macos,strict,introduced=10.9)))             \
        __attribute__((availability(ios,strict,introduced=7.0)))

    // locale::category
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 100900) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 70000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_LOCALE_CATEGORY
#   endif
#   define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY                                 \
        __attribute__((availability(macos,strict,introduced=10.9)))             \
        __attribute__((availability(ios,strict,introduced=7.0)))

    // atomic operations on shared_ptr
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 100900) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 70000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_ATOMIC_SHARED_PTR
#   endif
#   define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR                               \
        __attribute__((availability(macos,strict,introduced=10.9)))             \
        __attribute__((availability(ios,strict,introduced=7.0)))

    // <filesystem>
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 130000) || \
        (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 130000) ||         \
        (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 60000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_FILESYSTEM_LIBRARY
#   endif
#   define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY                              \
        __attribute__((availability(macos,strict,introduced=10.15)))            \
        __attribute__((availability(ios,strict,introduced=13.0)))               \
        __attribute__((availability(tvos,strict,introduced=13.0)))              \
        __attribute__((availability(watchos,strict,introduced=6.0)))
#   define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH                                 \
        _Pragma("clang attribute push(__attribute__((availability(macos,strict,introduced=10.15))), apply_to=any(function,record))") \
        _Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))")    \
        _Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))")   \
        _Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))")
#   define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP                                  \
        _Pragma("clang attribute pop")                                          \
        _Pragma("clang attribute pop")                                          \
        _Pragma("clang attribute pop")                                          \
        _Pragma("clang attribute pop")

    // std::to_chars(floating-point)
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 130300) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 160300) || \
        (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 160300) ||         \
        (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 90300)
#       define _LIBCPP_AVAILABILITY_HAS_NO_TO_CHARS_FLOATING_POINT
#   endif
#   define _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT                         \
        __attribute__((availability(macos,strict,introduced=13.3)))             \
        __attribute__((availability(ios,strict,introduced=16.3)))               \
        __attribute__((availability(tvos,strict,introduced=16.3)))              \
        __attribute__((availability(watchos,strict,introduced=9.3)))

    // c++20 synchronization library
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 110000) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 140000) || \
        (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 140000) ||         \
        (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 70000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_SYNC
#   endif
#   define _LIBCPP_AVAILABILITY_SYNC                                            \
        __attribute__((availability(macos,strict,introduced=11.0)))             \
        __attribute__((availability(ios,strict,introduced=14.0)))               \
        __attribute__((availability(tvos,strict,introduced=14.0)))              \
        __attribute__((availability(watchos,strict,introduced=7.0)))

    // __libcpp_verbose_abort
#   if 1 // TODO: Update once this is released
#       define _LIBCPP_AVAILABILITY_HAS_NO_VERBOSE_ABORT
#   endif
#   define _LIBCPP_AVAILABILITY_VERBOSE_ABORT                                   \
        __attribute__((unavailable))

    // std::pmr
#   if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 140000) ||    \
        (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 170000) || \
        (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 170000) ||         \
        (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 100000)
#       define _LIBCPP_AVAILABILITY_HAS_NO_PMR
#   endif
// TODO: Enable std::pmr markup once https://github.com/llvm/llvm-project/issues/40340 has been fixed
//       Until then, it is possible for folks to try to use `std::pmr` when back-deploying to targets that don't support
//       it and it'll be a load-time error, but we don't have a good alternative because the library won't compile if we
//       use availability annotations until that bug has been fixed.
#  if 0
#    define _LIBCPP_AVAILABILITY_PMR                                                                                   \
      __attribute__((availability(macos, strict, introduced = 14.0)))                                                  \
      __attribute__((availability(ios, strict, introduced = 17.0)))                                                    \
      __attribute__((availability(tvos, strict, introduced = 17.0)))                                                   \
      __attribute__((availability(watchos, strict, introduced = 10.0)))
#  else
#    define _LIBCPP_AVAILABILITY_PMR
#  endif

#  define _LIBCPP_AVAILABILITY_HAS_NO_TZDB
#  define _LIBCPP_AVAILABILITY_TZDB __attribute__((unavailable))

#else

// ...New vendors can add availability markup here...

#   error "It looks like you're trying to enable vendor availability markup, but you haven't defined the corresponding macros yet!"

#endif

// Define availability attributes that depend on _LIBCPP_HAS_NO_EXCEPTIONS.
// Those are defined in terms of the availability attributes above, and
// should not be vendor-specific.
#if defined(_LIBCPP_HAS_NO_EXCEPTIONS)
#   define _LIBCPP_AVAILABILITY_FUTURE
#   define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
#   define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
#   define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
#else
#   define _LIBCPP_AVAILABILITY_FUTURE                    _LIBCPP_AVAILABILITY_FUTURE_ERROR
#   define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST        _LIBCPP_AVAILABILITY_BAD_ANY_CAST
#   define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
#   define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS  _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS
#endif

#endif // _LIBCPP___AVAILABILITY