[libcxx-commits] [libcxx] [libc++] Reformulate availability in terms of LLVM releases (PR #87563)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Apr 15 08:18:09 PDT 2024
================
@@ -121,175 +121,287 @@
// TODO: Enable additional explicit instantiations on GCC once it supports exclude_from_explicit_instantiation,
// or once libc++ doesn't use the attribute anymore.
// TODO: Enable them on Windows once https://llvm.org/PR41018 has been fixed.
-# if !defined(_LIBCPP_COMPILER_GCC) && !defined(_WIN32)
-# define _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 1
-# else
-# define _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 0
-# endif
+#if !defined(_LIBCPP_COMPILER_GCC) && !defined(_WIN32)
+# define _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 _LIBCPP_INTRODUCED_IN_LLVM_12
+#else
+# define _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 0
+#endif
// This controls the availability of floating-point std::to_chars functions.
// These overloads were added later than the integer overloads.
-# define _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT 1
-# define _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT
+#define _LIBCPP_AVAILABILITY_HAS_TO_CHARS_FLOATING_POINT _LIBCPP_INTRODUCED_IN_LLVM_14
+#define _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT _LIBCPP_INTRODUCED_IN_LLVM_14_MARKUP
// 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_VERBOSE_ABORT 1
-# define _LIBCPP_AVAILABILITY_VERBOSE_ABORT
+#define _LIBCPP_AVAILABILITY_HAS_VERBOSE_ABORT _LIBCPP_INTRODUCED_IN_LLVM_15
+#define _LIBCPP_AVAILABILITY_VERBOSE_ABORT _LIBCPP_INTRODUCED_IN_LLVM_15_MARKUP
// 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_PMR 1
-# define _LIBCPP_AVAILABILITY_PMR
+//
+// 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.
+#define _LIBCPP_AVAILABILITY_HAS_PMR _LIBCPP_INTRODUCED_IN_LLVM_16
+#define _LIBCPP_AVAILABILITY_PMR
// These macros controls the availability of __cxa_init_primary_exception
// in the built library, which std::make_exception_ptr might use
// (see libcxx/include/__exception/exception_ptr.h).
-# define _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION 1
-# define _LIBCPP_AVAILABILITY_INIT_PRIMARY_EXCEPTION
+#define _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION _LIBCPP_INTRODUCED_IN_LLVM_18
+#define _LIBCPP_AVAILABILITY_INIT_PRIMARY_EXCEPTION _LIBCPP_INTRODUCED_IN_LLVM_18_MARKUP
// This controls the availability of C++23 <print>, which
// has a dependency on the built library (it needs access to
// the underlying buffer types of std::cout, std::cerr, and std::clog.
-# define _LIBCPP_AVAILABILITY_HAS_PRINT 1
-# define _LIBCPP_AVAILABILITY_PRINT
+#define _LIBCPP_AVAILABILITY_HAS_PRINT _LIBCPP_INTRODUCED_IN_LLVM_18
+#define _LIBCPP_AVAILABILITY_PRINT _LIBCPP_INTRODUCED_IN_LLVM_18_MARKUP
// This controls the availability of the C++20 time zone database.
// The parser code is built in the library.
-# define _LIBCPP_AVAILABILITY_HAS_TZDB 1
-# define _LIBCPP_AVAILABILITY_TZDB
+#define _LIBCPP_AVAILABILITY_HAS_TZDB _LIBCPP_INTRODUCED_IN_LLVM_19
+#define _LIBCPP_AVAILABILITY_TZDB _LIBCPP_INTRODUCED_IN_LLVM_19_MARKUP
-#elif defined(__APPLE__)
+// When availability annotations are disabled, we take for granted that features introduced
+// in all versions of the library are available.
+#if defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
-# define _LIBCPP_AVAILABILITY_HAS_BAD_OPTIONAL_ACCESS \
- (!defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) || __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ >= 50000)
+# define _LIBCPP_INTRODUCED_IN_LLVM_4 1
+# define _LIBCPP_INTRODUCED_IN_LLVM_4_MARKUP /* nothing */
-# define _LIBCPP_AVAILABILITY_HAS_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_HAS_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_HAS_BAD_ANY_CAST _LIBCPP_AVAILABILITY_HAS_BAD_OPTIONAL_ACCESS
+# define _LIBCPP_INTRODUCED_IN_LLVM_5 1
+# define _LIBCPP_INTRODUCED_IN_LLVM_5_MARKUP /* nothing */
-# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS __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
+# define _LIBCPP_INTRODUCED_IN_LLVM_6 1
+# define _LIBCPP_INTRODUCED_IN_LLVM_6_MARKUP /* nothing */
-// TODO: Update once this is released
-# define _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION 0
-# define _LIBCPP_AVAILABILITY_INIT_PRIMARY_EXCEPTION __attribute__((unavailable))
+# define _LIBCPP_INTRODUCED_IN_LLVM_7 1
+# define _LIBCPP_INTRODUCED_IN_LLVM_7_MARKUP /* nothing */
----------------
ldionne wrote:
Ok, I reordered them. I think I agree it's more readable that way.
https://github.com/llvm/llvm-project/pull/87563
More information about the libcxx-commits
mailing list