12eadbc86SLouis Dionne// -*- C++ -*- 22eadbc86SLouis Dionne//===----------------------------------------------------------------------===// 32eadbc86SLouis Dionne// 42eadbc86SLouis Dionne// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 52eadbc86SLouis Dionne// See https://llvm.org/LICENSE.txt for license information. 62eadbc86SLouis Dionne// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 72eadbc86SLouis Dionne// 82eadbc86SLouis Dionne//===----------------------------------------------------------------------===// 92eadbc86SLouis Dionne 102eadbc86SLouis Dionne#ifndef _LIBCPP___AVAILABILITY 112eadbc86SLouis Dionne#define _LIBCPP___AVAILABILITY 122eadbc86SLouis Dionne 132eadbc86SLouis Dionne#include <__config> 142eadbc86SLouis Dionne 152eadbc86SLouis Dionne#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 162eadbc86SLouis Dionne# pragma GCC system_header 172eadbc86SLouis Dionne#endif 182eadbc86SLouis Dionne 192eadbc86SLouis Dionne// Libc++ is shipped by various vendors. In particular, it is used as a system 202eadbc86SLouis Dionne// library on macOS, iOS and other Apple platforms. In order for users to be 212eadbc86SLouis Dionne// able to compile a binary that is intended to be deployed to an older version 222eadbc86SLouis Dionne// of a platform, Clang provides availability attributes [1]. These attributes 232eadbc86SLouis Dionne// can be placed on declarations and are used to describe the life cycle of a 242eadbc86SLouis Dionne// symbol in the library. 252eadbc86SLouis Dionne// 262eadbc86SLouis Dionne// The main goal is to ensure a compile-time error if a symbol that hasn't been 272eadbc86SLouis Dionne// introduced in a previously released library is used in a program that targets 282eadbc86SLouis Dionne// that previously released library. Normally, this would be a load-time error 292eadbc86SLouis Dionne// when one tries to launch the program against the older library. 302eadbc86SLouis Dionne// 312eadbc86SLouis Dionne// For example, the filesystem library was introduced in the dylib in macOS 10.15. 322eadbc86SLouis Dionne// If a user compiles on a macOS 10.15 host but targets macOS 10.13 with their 332eadbc86SLouis Dionne// program, the compiler would normally not complain (because the required 342eadbc86SLouis Dionne// declarations are in the headers), but the dynamic loader would fail to find 352eadbc86SLouis Dionne// the symbols when actually trying to launch the program on macOS 10.13. To 362eadbc86SLouis Dionne// turn this into a compile-time issue instead, declarations are annotated with 372eadbc86SLouis Dionne// when they were introduced, and the compiler can produce a diagnostic if the 382eadbc86SLouis Dionne// program references something that isn't available on the deployment target. 392eadbc86SLouis Dionne// 402eadbc86SLouis Dionne// This mechanism is general in nature, and any vendor can add their markup to 412eadbc86SLouis Dionne// the library (see below). Whenever a new feature is added that requires support 422eadbc86SLouis Dionne// in the shared library, a macro should be added below to mark this feature 432eadbc86SLouis Dionne// as unavailable. When vendors decide to ship the feature as part of their 442eadbc86SLouis Dionne// shared library, they can update the markup appropriately. 452eadbc86SLouis Dionne// 4676fc3575SLouis Dionne// Furthermore, many features in the standard library have corresponding 4776fc3575SLouis Dionne// feature-test macros. When a feature is made unavailable on some deployment 4876fc3575SLouis Dionne// target, a macro should be defined to signal that it is unavailable. That 4976fc3575SLouis Dionne// macro can then be picked up when feature-test macros are generated (see 5076fc3575SLouis Dionne// generate_feature_test_macro_components.py) to make sure that feature-test 5176fc3575SLouis Dionne// macros don't announce a feature as being implemented if it has been marked 5276fc3575SLouis Dionne// as unavailable. 5376fc3575SLouis Dionne// 542eadbc86SLouis Dionne// Note that this mechanism is disabled by default in the "upstream" libc++. 552eadbc86SLouis Dionne// Availability annotations are only meaningful when shipping libc++ inside 562eadbc86SLouis Dionne// a platform (i.e. as a system library), and so vendors that want them should 572eadbc86SLouis Dionne// turn those annotations on at CMake configuration time. 582eadbc86SLouis Dionne// 592eadbc86SLouis Dionne// [1]: https://clang.llvm.org/docs/AttributeReference.html#availability 602eadbc86SLouis Dionne 612eadbc86SLouis Dionne 622eadbc86SLouis Dionne// For backwards compatibility, allow users to define _LIBCPP_DISABLE_AVAILABILITY 632eadbc86SLouis Dionne// for a while. 642eadbc86SLouis Dionne#if defined(_LIBCPP_DISABLE_AVAILABILITY) 652eadbc86SLouis Dionne# if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) 662eadbc86SLouis Dionne# define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS 672eadbc86SLouis Dionne# endif 682eadbc86SLouis Dionne#endif 692eadbc86SLouis Dionne 702eadbc86SLouis Dionne// Availability markup is disabled when building the library, or when the compiler 712eadbc86SLouis Dionne// doesn't support the proper attributes. 722eadbc86SLouis Dionne#if defined(_LIBCPP_BUILDING_LIBRARY) || \ 732eadbc86SLouis Dionne defined(_LIBCXXABI_BUILDING_LIBRARY) || \ 742eadbc86SLouis Dionne !__has_feature(attribute_availability_with_strict) || \ 752eadbc86SLouis Dionne !__has_feature(attribute_availability_in_templates) || \ 762eadbc86SLouis Dionne !__has_extension(pragma_clang_attribute_external_declaration) 772eadbc86SLouis Dionne# if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) 782eadbc86SLouis Dionne# define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS 792eadbc86SLouis Dionne# endif 802eadbc86SLouis Dionne#endif 812eadbc86SLouis Dionne 822eadbc86SLouis Dionne#if defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) 832eadbc86SLouis Dionne 842eadbc86SLouis Dionne // This controls the availability of std::shared_mutex and std::shared_timed_mutex, 852eadbc86SLouis Dionne // which were added to the dylib later. 862eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_SHARED_MUTEX 8776fc3575SLouis Dionne// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_mutex 8876fc3575SLouis Dionne// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_timed_mutex 892eadbc86SLouis Dionne 902eadbc86SLouis Dionne // These macros control the availability of std::bad_optional_access and 912eadbc86SLouis Dionne // other exception types. These were put in the shared library to prevent 922eadbc86SLouis Dionne // code bloat from every user program defining the vtable for these exception 932eadbc86SLouis Dionne // types. 9459fae7b2SLouis Dionne // 9559fae7b2SLouis Dionne // Note that when exceptions are disabled, the methods that normally throw 9659fae7b2SLouis Dionne // these exceptions can be used even on older deployment targets, but those 9759fae7b2SLouis Dionne // methods will abort instead of throwing. 982eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS 992eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS 1002eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST 1012eadbc86SLouis Dionne 1022eadbc86SLouis Dionne // This controls the availability of std::uncaught_exceptions(). 1032eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS 1042eadbc86SLouis Dionne 1052eadbc86SLouis Dionne // This controls the availability of the sized version of ::operator delete, 10659fae7b2SLouis Dionne // ::operator delete[], and their align_val_t variants, which were all added 10759fae7b2SLouis Dionne // in C++17, and hence not present in early dylibs. 1082eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE 1092eadbc86SLouis Dionne 1102eadbc86SLouis Dionne // This controls the availability of the std::future_error exception. 11159fae7b2SLouis Dionne // 11259fae7b2SLouis Dionne // Note that when exceptions are disabled, the methods that normally throw 11359fae7b2SLouis Dionne // std::future_error can be used even on older deployment targets, but those 11459fae7b2SLouis Dionne // methods will abort instead of throwing. 1152eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_FUTURE_ERROR 1162eadbc86SLouis Dionne 1172eadbc86SLouis Dionne // This controls the availability of std::type_info's vtable. 1182eadbc86SLouis Dionne // I can't imagine how using std::type_info can work at all if 1192eadbc86SLouis Dionne // this isn't supported. 1202eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE 1212eadbc86SLouis Dionne 1222eadbc86SLouis Dionne // This controls the availability of std::locale::category members 1232eadbc86SLouis Dionne // (e.g. std::locale::collate), which are defined in the dylib. 1242eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY 1252eadbc86SLouis Dionne 1262eadbc86SLouis Dionne // This controls the availability of atomic operations on std::shared_ptr 1272eadbc86SLouis Dionne // (e.g. `std::atomic_store(std::shared_ptr)`), which require a shared 1282eadbc86SLouis Dionne // lock table located in the dylib. 1292eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 1302eadbc86SLouis Dionne 1312eadbc86SLouis Dionne // These macros control the availability of all parts of <filesystem> that 1322eadbc86SLouis Dionne // depend on something in the dylib. 1332eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_FILESYSTEM 1342eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH 1352eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP 13676fc3575SLouis Dionne// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_filesystem 1372eadbc86SLouis Dionne 138abb5dd6eSMark de Wever // This controls the availability of floating-point std::to_chars functions. 139abb5dd6eSMark de Wever // These overloads were added later than the integer overloads. 140abb5dd6eSMark de Wever# define _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT 141abb5dd6eSMark de Wever 1422eadbc86SLouis Dionne // This controls the availability of the C++20 synchronization library, 1432eadbc86SLouis Dionne // which requires shared library support for various operations 14459fae7b2SLouis Dionne // (see libcxx/src/atomic.cpp). This includes <barier>, <latch>, 14559fae7b2SLouis Dionne // <semaphore>, and notification functions on std::atomic. 1462eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_SYNC 14776fc3575SLouis Dionne// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_atomic_wait 14876fc3575SLouis Dionne// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_barrier 14976fc3575SLouis Dionne// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_latch 15076fc3575SLouis Dionne// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_semaphore 1512eadbc86SLouis Dionne 152963495f0SMark de Wever // This controls the availability of the C++20 format library. 1530922ce56SMark de Wever // The library is in development and not ABI stable yet. P2216 is 1540922ce56SMark de Wever // retroactively accepted in C++20. This paper contains ABI breaking 1550922ce56SMark de Wever // changes. 156963495f0SMark de Wever# define _LIBCPP_AVAILABILITY_FORMAT 157963495f0SMark de Wever// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_format 158963495f0SMark de Wever 1593a55353fSLouis Dionne // This controls whether the default verbose termination function is 1603a55353fSLouis Dionne // provided by the library. 161b0fd9497SLouis Dionne // 1623a55353fSLouis Dionne // Note that when users provide their own custom function, it doesn't 1633a55353fSLouis Dionne // matter whether the dylib provides a default function, and the 1643a55353fSLouis Dionne // availability markup can actually give a false positive diagnostic 1653a55353fSLouis Dionne // (it will think that no function is provided, when in reality the 1663a55353fSLouis Dionne // user has provided their own). 167b0fd9497SLouis Dionne // 1683a55353fSLouis Dionne // Users can pass -D_LIBCPP_AVAILABILITY_CUSTOM_VERBOSE_ABORT_PROVIDED 169*2fb8f67eSLouis Dionne // to the compiler to tell the library not to define its own verbose abort. 170*2fb8f67eSLouis Dionne // Note that defining this macro but failing to define a custom function 171*2fb8f67eSLouis Dionne // will lead to a load-time error on back-deployment targets, so it should 172*2fb8f67eSLouis Dionne // be avoided. 173*2fb8f67eSLouis Dionne// # define _LIBCPP_HAS_NO_VERBOSE_ABORT_IN_LIBRARY 174b0fd9497SLouis Dionne 1752eadbc86SLouis Dionne#elif defined(__APPLE__) 1762eadbc86SLouis Dionne 1772eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_SHARED_MUTEX \ 178215f5fd1SLouis Dionne __attribute__((availability(macos,strict,introduced=10.12))) \ 1792eadbc86SLouis Dionne __attribute__((availability(ios,strict,introduced=10.0))) \ 1802eadbc86SLouis Dionne __attribute__((availability(tvos,strict,introduced=10.0))) \ 1812eadbc86SLouis Dionne __attribute__((availability(watchos,strict,introduced=3.0))) 18276fc3575SLouis Dionne# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200) || \ 18376fc3575SLouis Dionne (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 100000) || \ 18476fc3575SLouis Dionne (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 100000) || \ 18576fc3575SLouis Dionne (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 30000) 18676fc3575SLouis Dionne# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_mutex 18776fc3575SLouis Dionne# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_timed_mutex 18876fc3575SLouis Dionne# endif 18976fc3575SLouis Dionne 1900bc451e7SLouis Dionne // Note: bad_optional_access & friends were not introduced in the matching 1910bc451e7SLouis Dionne // macOS and iOS versions, so the version mismatch between macOS and others 1920bc451e7SLouis Dionne // is intended. 1932eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS \ 194215f5fd1SLouis Dionne __attribute__((availability(macos,strict,introduced=10.13))) \ 1950bc451e7SLouis Dionne __attribute__((availability(ios,strict,introduced=12.0))) \ 1960bc451e7SLouis Dionne __attribute__((availability(tvos,strict,introduced=12.0))) \ 1970bc451e7SLouis Dionne __attribute__((availability(watchos,strict,introduced=5.0))) 1982eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS \ 1992eadbc86SLouis Dionne _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS 2002eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST \ 2012eadbc86SLouis Dionne _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS 20276fc3575SLouis Dionne 2032eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS \ 204215f5fd1SLouis Dionne __attribute__((availability(macos,strict,introduced=10.12))) \ 2052eadbc86SLouis Dionne __attribute__((availability(ios,strict,introduced=10.0))) \ 2062eadbc86SLouis Dionne __attribute__((availability(tvos,strict,introduced=10.0))) \ 2072eadbc86SLouis Dionne __attribute__((availability(watchos,strict,introduced=3.0))) 20876fc3575SLouis Dionne 2092eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE \ 210215f5fd1SLouis Dionne __attribute__((availability(macos,strict,introduced=10.12))) \ 2112eadbc86SLouis Dionne __attribute__((availability(ios,strict,introduced=10.0))) \ 2122eadbc86SLouis Dionne __attribute__((availability(tvos,strict,introduced=10.0))) \ 2132eadbc86SLouis Dionne __attribute__((availability(watchos,strict,introduced=3.0))) 21476fc3575SLouis Dionne 2152eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_FUTURE_ERROR \ 2162eadbc86SLouis Dionne __attribute__((availability(ios,strict,introduced=6.0))) 21776fc3575SLouis Dionne 2182eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE \ 219215f5fd1SLouis Dionne __attribute__((availability(macos,strict,introduced=10.9))) \ 2202eadbc86SLouis Dionne __attribute__((availability(ios,strict,introduced=7.0))) 22176fc3575SLouis Dionne 2222eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY \ 223215f5fd1SLouis Dionne __attribute__((availability(macos,strict,introduced=10.9))) \ 2242eadbc86SLouis Dionne __attribute__((availability(ios,strict,introduced=7.0))) 22576fc3575SLouis Dionne 2262eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR \ 227215f5fd1SLouis Dionne __attribute__((availability(macos,strict,introduced=10.9))) \ 2282eadbc86SLouis Dionne __attribute__((availability(ios,strict,introduced=7.0))) 22976fc3575SLouis Dionne 2302eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_FILESYSTEM \ 231215f5fd1SLouis Dionne __attribute__((availability(macos,strict,introduced=10.15))) \ 2322eadbc86SLouis Dionne __attribute__((availability(ios,strict,introduced=13.0))) \ 2332eadbc86SLouis Dionne __attribute__((availability(tvos,strict,introduced=13.0))) \ 2342eadbc86SLouis Dionne __attribute__((availability(watchos,strict,introduced=6.0))) 2352eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH \ 236215f5fd1SLouis Dionne _Pragma("clang attribute push(__attribute__((availability(macos,strict,introduced=10.15))), apply_to=any(function,record))") \ 2372eadbc86SLouis Dionne _Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))") \ 2382eadbc86SLouis Dionne _Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))") \ 2392eadbc86SLouis Dionne _Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))") 2402eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP \ 2412eadbc86SLouis Dionne _Pragma("clang attribute pop") \ 2422eadbc86SLouis Dionne _Pragma("clang attribute pop") \ 2432eadbc86SLouis Dionne _Pragma("clang attribute pop") \ 2442eadbc86SLouis Dionne _Pragma("clang attribute pop") 24576fc3575SLouis Dionne# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500) || \ 24676fc3575SLouis Dionne (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 130000) || \ 24776fc3575SLouis Dionne (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 130000) || \ 24876fc3575SLouis Dionne (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 60000) 24976fc3575SLouis Dionne# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_filesystem 25076fc3575SLouis Dionne# endif 25176fc3575SLouis Dionne 252abb5dd6eSMark de Wever# define _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT \ 253abb5dd6eSMark de Wever __attribute__((unavailable)) 254abb5dd6eSMark de Wever 2552eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_SYNC \ 256215f5fd1SLouis Dionne __attribute__((availability(macos,strict,introduced=11.0))) \ 257f84dbd2fSLouis Dionne __attribute__((availability(ios,strict,introduced=14.0))) \ 258f84dbd2fSLouis Dionne __attribute__((availability(tvos,strict,introduced=14.0))) \ 259f84dbd2fSLouis Dionne __attribute__((availability(watchos,strict,introduced=7.0))) 260f84dbd2fSLouis Dionne# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 110000) || \ 261f84dbd2fSLouis Dionne (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 140000) || \ 262f84dbd2fSLouis Dionne (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 140000) || \ 263f84dbd2fSLouis Dionne (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 70000) 26476fc3575SLouis Dionne# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_atomic_wait 26576fc3575SLouis Dionne# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_barrier 26676fc3575SLouis Dionne# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_latch 26776fc3575SLouis Dionne# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_semaphore 268f84dbd2fSLouis Dionne# endif 2692eadbc86SLouis Dionne 270963495f0SMark de Wever# define _LIBCPP_AVAILABILITY_FORMAT \ 271963495f0SMark de Wever __attribute__((unavailable)) 272963495f0SMark de Wever# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_format 273b0fd9497SLouis Dionne 274*2fb8f67eSLouis Dionne# define _LIBCPP_HAS_NO_VERBOSE_ABORT_IN_LIBRARY 275*2fb8f67eSLouis Dionne 2762eadbc86SLouis Dionne#else 2772eadbc86SLouis Dionne 2782eadbc86SLouis Dionne// ...New vendors can add availability markup here... 2792eadbc86SLouis Dionne 2802eadbc86SLouis Dionne# error "It looks like you're trying to enable vendor availability markup, but you haven't defined the corresponding macros yet!" 2812eadbc86SLouis Dionne 2822eadbc86SLouis Dionne#endif 2832eadbc86SLouis Dionne 2842eadbc86SLouis Dionne// Define availability attributes that depend on _LIBCPP_NO_EXCEPTIONS. 2852eadbc86SLouis Dionne// Those are defined in terms of the availability attributes above, and 2862eadbc86SLouis Dionne// should not be vendor-specific. 2872eadbc86SLouis Dionne#if defined(_LIBCPP_NO_EXCEPTIONS) 2882eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_FUTURE 2892eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 2902eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS 2912eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS 2922eadbc86SLouis Dionne#else 2932eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_FUTURE _LIBCPP_AVAILABILITY_FUTURE_ERROR 2942eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST _LIBCPP_AVAILABILITY_BAD_ANY_CAST 2952eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS 2962eadbc86SLouis Dionne# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS 2972eadbc86SLouis Dionne#endif 2982eadbc86SLouis Dionne 2992eadbc86SLouis Dionne#endif // _LIBCPP___AVAILABILITY 300