1 // -*- C++ -*- 2 //===----------------------------------------------------------------------===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef _LIBCPP___CONFIGURATION_AVAILABILITY_H 11 #define _LIBCPP___CONFIGURATION_AVAILABILITY_H 12 13 #include <__configuration/compiler.h> 14 #include <__configuration/language.h> 15 16 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17 # pragma GCC system_header 18 #endif 19 20 // Libc++ is shipped by various vendors. In particular, it is used as a system 21 // library on macOS, iOS and other Apple platforms. In order for users to be 22 // able to compile a binary that is intended to be deployed to an older version 23 // of a platform, Clang provides availability attributes [1]. These attributes 24 // can be placed on declarations and are used to describe the life cycle of a 25 // symbol in the library. 26 // 27 // The main goal is to ensure a compile-time error if a symbol that hasn't been 28 // introduced in a previously released library is used in a program that targets 29 // that previously released library. Normally, this would be a load-time error 30 // when one tries to launch the program against the older library. 31 // 32 // For example, the filesystem library was introduced in the dylib in LLVM 9. 33 // On Apple platforms, this corresponds to macOS 10.15. If a user compiles on 34 // a macOS 10.15 host but targets macOS 10.13 with their program, the compiler 35 // would normally not complain (because the required declarations are in the 36 // headers), but the dynamic loader would fail to find the symbols when actually 37 // trying to launch the program on macOS 10.13. To turn this into a compile-time 38 // issue instead, declarations are annotated with when they were introduced, and 39 // the compiler can produce a diagnostic if the program references something that 40 // isn't available on the deployment target. 41 // 42 // This mechanism is general in nature, and any vendor can add their markup to 43 // the library (see below). Whenever a new feature is added that requires support 44 // in the shared library, two macros are added below to allow marking the feature 45 // as unavailable: 46 // 1. A macro named `_LIBCPP_AVAILABILITY_HAS_<feature>` which must be defined 47 // to `_LIBCPP_INTRODUCED_IN_<version>` for the appropriate LLVM version. 48 // 2. A macro named `_LIBCPP_AVAILABILITY_<feature>`, which must be defined to 49 // `_LIBCPP_INTRODUCED_IN_<version>_MARKUP` for the appropriate LLVM version. 50 // 51 // When vendors decide to ship the feature as part of their shared library, they 52 // can update the `_LIBCPP_INTRODUCED_IN_<version>` macro (and the markup counterpart) 53 // based on the platform version they shipped that version of LLVM in. The library 54 // will then use this markup to provide an optimal user experience on these platforms. 55 // 56 // Furthermore, many features in the standard library have corresponding 57 // feature-test macros. The `_LIBCPP_AVAILABILITY_HAS_<feature>` macros 58 // are checked by the corresponding feature-test macros generated by 59 // generate_feature_test_macro_components.py to ensure that the library 60 // doesn't announce a feature as being implemented if it is unavailable on 61 // the deployment target. 62 // 63 // Note that this mechanism is disabled by default in the "upstream" libc++. 64 // Availability annotations are only meaningful when shipping libc++ inside 65 // a platform (i.e. as a system library), and so vendors that want them should 66 // turn those annotations on at CMake configuration time. 67 // 68 // [1]: https://clang.llvm.org/docs/AttributeReference.html#availability 69 70 // Availability markup is disabled when building the library, or when a non-Clang 71 // compiler is used because only Clang supports the necessary attributes. 72 #if defined(_LIBCPP_BUILDING_LIBRARY) || defined(_LIBCXXABI_BUILDING_LIBRARY) || !defined(_LIBCPP_COMPILER_CLANG_BASED) 73 # undef _LIBCPP_HAS_VENDOR_AVAILABILITY_ANNOTATIONS 74 # define _LIBCPP_HAS_VENDOR_AVAILABILITY_ANNOTATIONS 0 75 #endif 76 77 // When availability annotations are disabled, we take for granted that features introduced 78 // in all versions of the library are available. 79 #if !_LIBCPP_HAS_VENDOR_AVAILABILITY_ANNOTATIONS 80 81 # define _LIBCPP_INTRODUCED_IN_LLVM_20 1 82 # define _LIBCPP_INTRODUCED_IN_LLVM_20_ATTRIBUTE /* nothing */ 83 84 # define _LIBCPP_INTRODUCED_IN_LLVM_19 1 85 # define _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE /* nothing */ 86 87 # define _LIBCPP_INTRODUCED_IN_LLVM_18 1 88 # define _LIBCPP_INTRODUCED_IN_LLVM_18_ATTRIBUTE /* nothing */ 89 90 # define _LIBCPP_INTRODUCED_IN_LLVM_16 1 91 # define _LIBCPP_INTRODUCED_IN_LLVM_16_ATTRIBUTE /* nothing */ 92 93 # define _LIBCPP_INTRODUCED_IN_LLVM_15 1 94 # define _LIBCPP_INTRODUCED_IN_LLVM_15_ATTRIBUTE /* nothing */ 95 96 # define _LIBCPP_INTRODUCED_IN_LLVM_14 1 97 # define _LIBCPP_INTRODUCED_IN_LLVM_14_ATTRIBUTE /* nothing */ 98 99 # define _LIBCPP_INTRODUCED_IN_LLVM_12 1 100 # define _LIBCPP_INTRODUCED_IN_LLVM_12_ATTRIBUTE /* nothing */ 101 102 # define _LIBCPP_INTRODUCED_IN_LLVM_11 1 103 # define _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE /* nothing */ 104 105 # define _LIBCPP_INTRODUCED_IN_LLVM_9 1 106 # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE /* nothing */ 107 # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_PUSH /* nothing */ 108 # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_POP /* nothing */ 109 110 # define _LIBCPP_INTRODUCED_IN_LLVM_4 1 111 # define _LIBCPP_INTRODUCED_IN_LLVM_4_ATTRIBUTE /* nothing */ 112 113 #elif defined(__APPLE__) 114 115 // clang-format off 116 117 // LLVM 20 118 // TODO: Fill this in 119 # define _LIBCPP_INTRODUCED_IN_LLVM_20 0 120 # define _LIBCPP_INTRODUCED_IN_LLVM_20_ATTRIBUTE __attribute__((unavailable)) 121 122 // LLVM 19 123 // TODO: Fill this in 124 # define _LIBCPP_INTRODUCED_IN_LLVM_19 0 125 # define _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE __attribute__((unavailable)) 126 127 // LLVM 18 128 # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 150000) || \ 129 (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 180000) || \ 130 (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 180000) || \ 131 (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 110000) || \ 132 (defined(__ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ < 90000) || \ 133 (defined(__ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__ < 240000) 134 # define _LIBCPP_INTRODUCED_IN_LLVM_18 0 135 # else 136 # define _LIBCPP_INTRODUCED_IN_LLVM_18 1 137 # endif 138 # define _LIBCPP_INTRODUCED_IN_LLVM_18_ATTRIBUTE \ 139 __attribute__((availability(macos, strict, introduced = 15.0))) \ 140 __attribute__((availability(ios, strict, introduced = 18.0))) \ 141 __attribute__((availability(tvos, strict, introduced = 18.0))) \ 142 __attribute__((availability(watchos, strict, introduced = 11.0))) \ 143 __attribute__((availability(bridgeos, strict, introduced = 9.0))) \ 144 __attribute__((availability(driverkit, strict, introduced = 24.0))) 145 146 // LLVM 16 147 # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 140000) || \ 148 (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 170000) || \ 149 (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 170000) || \ 150 (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 100000) || \ 151 (defined(__ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ < 80000) || \ 152 (defined(__ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__ < 230000) 153 # define _LIBCPP_INTRODUCED_IN_LLVM_16 0 154 # else 155 # define _LIBCPP_INTRODUCED_IN_LLVM_16 1 156 # endif 157 # define _LIBCPP_INTRODUCED_IN_LLVM_16_ATTRIBUTE \ 158 __attribute__((availability(macos, strict, introduced = 14.0))) \ 159 __attribute__((availability(ios, strict, introduced = 17.0))) \ 160 __attribute__((availability(tvos, strict, introduced = 17.0))) \ 161 __attribute__((availability(watchos, strict, introduced = 10.0))) \ 162 __attribute__((availability(bridgeos, strict, introduced = 8.0))) \ 163 __attribute__((availability(driverkit, strict, introduced = 23.0))) 164 165 // LLVM 15 166 # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 130400) || \ 167 (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 160500) || \ 168 (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 160500) || \ 169 (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 90500) || \ 170 (defined(__ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ < 70500) || \ 171 (defined(__ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__ < 220400) 172 # define _LIBCPP_INTRODUCED_IN_LLVM_15 0 173 # else 174 # define _LIBCPP_INTRODUCED_IN_LLVM_15 1 175 # endif 176 # define _LIBCPP_INTRODUCED_IN_LLVM_15_ATTRIBUTE \ 177 __attribute__((availability(macos, strict, introduced = 13.4))) \ 178 __attribute__((availability(ios, strict, introduced = 16.5))) \ 179 __attribute__((availability(tvos, strict, introduced = 16.5))) \ 180 __attribute__((availability(watchos, strict, introduced = 9.5))) \ 181 __attribute__((availability(bridgeos, strict, introduced = 7.5))) \ 182 __attribute__((availability(driverkit, strict, introduced = 22.4))) 183 184 // LLVM 14 185 # define _LIBCPP_INTRODUCED_IN_LLVM_14 _LIBCPP_INTRODUCED_IN_LLVM_15 186 # define _LIBCPP_INTRODUCED_IN_LLVM_14_ATTRIBUTE _LIBCPP_INTRODUCED_IN_LLVM_15_ATTRIBUTE 187 188 // LLVM 12 189 # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 120300) || \ 190 (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 150300) || \ 191 (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 150300) || \ 192 (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 80300) || \ 193 (defined(__ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ < 60000) || \ 194 (defined(__ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__ < 210300) 195 # define _LIBCPP_INTRODUCED_IN_LLVM_12 0 196 # else 197 # define _LIBCPP_INTRODUCED_IN_LLVM_12 1 198 # endif 199 # define _LIBCPP_INTRODUCED_IN_LLVM_12_ATTRIBUTE \ 200 __attribute__((availability(macos, strict, introduced = 12.3))) \ 201 __attribute__((availability(ios, strict, introduced = 15.3))) \ 202 __attribute__((availability(tvos, strict, introduced = 15.3))) \ 203 __attribute__((availability(watchos, strict, introduced = 8.3))) \ 204 __attribute__((availability(bridgeos, strict, introduced = 6.0))) \ 205 __attribute__((availability(driverkit, strict, introduced = 21.3))) 206 207 // LLVM 11 208 # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 110000) || \ 209 (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 140000) || \ 210 (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 140000) || \ 211 (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 70000) 212 # define _LIBCPP_INTRODUCED_IN_LLVM_11 0 213 # else 214 # define _LIBCPP_INTRODUCED_IN_LLVM_11 1 215 # endif 216 # define _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE \ 217 __attribute__((availability(macos, strict, introduced = 11.0))) \ 218 __attribute__((availability(ios, strict, introduced = 14.0))) \ 219 __attribute__((availability(tvos, strict, introduced = 14.0))) \ 220 __attribute__((availability(watchos, strict, introduced = 7.0))) 221 222 // LLVM 9 223 # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500) || \ 224 (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 130000) || \ 225 (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 130000) || \ 226 (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 60000) 227 # define _LIBCPP_INTRODUCED_IN_LLVM_9 0 228 # else 229 # define _LIBCPP_INTRODUCED_IN_LLVM_9 1 230 # endif 231 # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE \ 232 __attribute__((availability(macos, strict, introduced = 10.15))) \ 233 __attribute__((availability(ios, strict, introduced = 13.0))) \ 234 __attribute__((availability(tvos, strict, introduced = 13.0))) \ 235 __attribute__((availability(watchos, strict, introduced = 6.0))) 236 # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_PUSH \ 237 _Pragma("clang attribute push(__attribute__((availability(macos,strict,introduced=10.15))), apply_to=any(function,record))") \ 238 _Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))") \ 239 _Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))") \ 240 _Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))") 241 # define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_POP \ 242 _Pragma("clang attribute pop") \ 243 _Pragma("clang attribute pop") \ 244 _Pragma("clang attribute pop") \ 245 _Pragma("clang attribute pop") 246 247 // LLVM 4 248 # if defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 50000 249 # define _LIBCPP_INTRODUCED_IN_LLVM_4 0 250 # else 251 # define _LIBCPP_INTRODUCED_IN_LLVM_4 1 252 # endif 253 # define _LIBCPP_INTRODUCED_IN_LLVM_4_ATTRIBUTE __attribute__((availability(watchos, strict, introduced = 5.0))) 254 255 // clang-format on 256 257 #else 258 259 // ...New vendors can add availability markup here... 260 261 # error \ 262 "It looks like you're trying to enable vendor availability markup, but you haven't defined the corresponding macros yet!" 263 264 #endif 265 266 // These macros control the availability of std::bad_optional_access and 267 // other exception types. These were put in the shared library to prevent 268 // code bloat from every user program defining the vtable for these exception 269 // types. 270 // 271 // Note that when exceptions are disabled, the methods that normally throw 272 // these exceptions can be used even on older deployment targets, but those 273 // methods will abort instead of throwing. 274 #define _LIBCPP_AVAILABILITY_HAS_BAD_OPTIONAL_ACCESS _LIBCPP_INTRODUCED_IN_LLVM_4 275 #define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS _LIBCPP_INTRODUCED_IN_LLVM_4_ATTRIBUTE 276 277 #define _LIBCPP_AVAILABILITY_HAS_BAD_VARIANT_ACCESS _LIBCPP_INTRODUCED_IN_LLVM_4 278 #define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS _LIBCPP_INTRODUCED_IN_LLVM_4_ATTRIBUTE 279 280 #define _LIBCPP_AVAILABILITY_HAS_BAD_ANY_CAST _LIBCPP_INTRODUCED_IN_LLVM_4 281 #define _LIBCPP_AVAILABILITY_BAD_ANY_CAST _LIBCPP_INTRODUCED_IN_LLVM_4_ATTRIBUTE 282 283 // These macros control the availability of all parts of <filesystem> that 284 // depend on something in the dylib. 285 #define _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_LIBRARY _LIBCPP_INTRODUCED_IN_LLVM_9 286 #define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE 287 #define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_PUSH 288 #define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_POP 289 290 // This controls the availability of the C++20 synchronization library, 291 // which requires shared library support for various operations 292 // (see libcxx/src/atomic.cpp). This includes <barier>, <latch>, 293 // <semaphore>, and notification functions on std::atomic. 294 #define _LIBCPP_AVAILABILITY_HAS_SYNC _LIBCPP_INTRODUCED_IN_LLVM_11 295 #define _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE 296 297 // Enable additional explicit instantiations of iostreams components. This 298 // reduces the number of weak definitions generated in programs that use 299 // iostreams by providing a single strong definition in the shared library. 300 // 301 // TODO: Enable additional explicit instantiations on GCC once it supports exclude_from_explicit_instantiation, 302 // or once libc++ doesn't use the attribute anymore. 303 // TODO: Enable them on Windows once https://llvm.org/PR41018 has been fixed. 304 #if !defined(_LIBCPP_COMPILER_GCC) && !defined(_WIN32) 305 # define _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 _LIBCPP_INTRODUCED_IN_LLVM_12 306 #else 307 # define _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 0 308 #endif 309 310 // This controls the availability of floating-point std::to_chars functions. 311 // These overloads were added later than the integer overloads. 312 #define _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT _LIBCPP_INTRODUCED_IN_LLVM_14 313 #define _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT _LIBCPP_INTRODUCED_IN_LLVM_14_ATTRIBUTE 314 315 // This controls whether the library claims to provide a default verbose 316 // termination function, and consequently whether the headers will try 317 // to use it when the mechanism isn't overriden at compile-time. 318 #define _LIBCPP_AVAILABILITY_HAS_VERBOSE_ABORT _LIBCPP_INTRODUCED_IN_LLVM_15 319 #define _LIBCPP_AVAILABILITY_VERBOSE_ABORT _LIBCPP_INTRODUCED_IN_LLVM_15_ATTRIBUTE 320 321 // This controls the availability of the C++17 std::pmr library, 322 // which is implemented in large part in the built library. 323 // 324 // TODO: Enable std::pmr markup once https://github.com/llvm/llvm-project/issues/40340 has been fixed 325 // Until then, it is possible for folks to try to use `std::pmr` when back-deploying to targets that don't support 326 // 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 327 // use availability annotations until that bug has been fixed. 328 #define _LIBCPP_AVAILABILITY_HAS_PMR _LIBCPP_INTRODUCED_IN_LLVM_16 329 #define _LIBCPP_AVAILABILITY_PMR 330 331 // These macros controls the availability of __cxa_init_primary_exception 332 // in the built library, which std::make_exception_ptr might use 333 // (see libcxx/include/__exception/exception_ptr.h). 334 #define _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION _LIBCPP_INTRODUCED_IN_LLVM_18 335 #define _LIBCPP_AVAILABILITY_INIT_PRIMARY_EXCEPTION _LIBCPP_INTRODUCED_IN_LLVM_18_ATTRIBUTE 336 337 // This controls the availability of C++23 <print>, which 338 // has a dependency on the built library (it needs access to 339 // the underlying buffer types of std::cout, std::cerr, and std::clog. 340 #define _LIBCPP_AVAILABILITY_HAS_PRINT _LIBCPP_INTRODUCED_IN_LLVM_18 341 #define _LIBCPP_AVAILABILITY_PRINT _LIBCPP_INTRODUCED_IN_LLVM_18_ATTRIBUTE 342 343 // This controls the availability of the C++20 time zone database. 344 // The parser code is built in the library. 345 #define _LIBCPP_AVAILABILITY_HAS_TZDB _LIBCPP_INTRODUCED_IN_LLVM_19 346 #define _LIBCPP_AVAILABILITY_TZDB _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE 347 348 // These macros determine whether we assume that std::bad_function_call and 349 // std::bad_expected_access provide a key function in the dylib. This allows 350 // centralizing their vtable and typeinfo instead of having all TUs provide 351 // a weak definition that then gets deduplicated. 352 #define _LIBCPP_AVAILABILITY_HAS_BAD_FUNCTION_CALL_KEY_FUNCTION _LIBCPP_INTRODUCED_IN_LLVM_19 353 #define _LIBCPP_AVAILABILITY_BAD_FUNCTION_CALL_KEY_FUNCTION _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE 354 #define _LIBCPP_AVAILABILITY_HAS_BAD_EXPECTED_ACCESS_KEY_FUNCTION _LIBCPP_INTRODUCED_IN_LLVM_19 355 #define _LIBCPP_AVAILABILITY_BAD_EXPECTED_ACCESS_KEY_FUNCTION _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE 356 357 // This controls the availability of floating-point std::from_chars functions. 358 // These overloads were added later than the integer overloads. 359 #define _LIBCPP_AVAILABILITY_HAS_FROM_CHARS_FLOATING_POINT _LIBCPP_INTRODUCED_IN_LLVM_20 360 #define _LIBCPP_AVAILABILITY_FROM_CHARS_FLOATING_POINT _LIBCPP_INTRODUCED_IN_LLVM_20_ATTRIBUTE 361 362 // Define availability attributes that depend on _LIBCPP_HAS_EXCEPTIONS. 363 // Those are defined in terms of the availability attributes above, and 364 // should not be vendor-specific. 365 #if !_LIBCPP_HAS_EXCEPTIONS 366 # define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST 367 # define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS 368 # define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS 369 #else 370 # define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST _LIBCPP_AVAILABILITY_BAD_ANY_CAST 371 # define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS 372 # define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS 373 #endif 374 375 // Define availability attributes that depend on both 376 // _LIBCPP_HAS_EXCEPTIONS and _LIBCPP_HAS_RTTI. 377 #if !_LIBCPP_HAS_EXCEPTIONS || !_LIBCPP_HAS_RTTI 378 # undef _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION 379 # undef _LIBCPP_AVAILABILITY_INIT_PRIMARY_EXCEPTION 380 # define _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION 0 381 # define _LIBCPP_AVAILABILITY_INIT_PRIMARY_EXCEPTION 382 #endif 383 384 #endif // _LIBCPP___CONFIGURATION_AVAILABILITY_H 385