From 4578bc5f9c33f2ca2f9a4be0624b5fccdb50126f Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Thu, 15 May 2025 10:53:18 -0400 Subject: [PATCH 1/5] [libc++] Add availability markup for LLVM 19 An LLVM 19-aligned libc++ was released with macOS 15.4 (and corresponding OSes). This patch adds availability markup to reflect that. --- libcxx/include/__configuration/availability.h | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/libcxx/include/__configuration/availability.h b/libcxx/include/__configuration/availability.h index d0414ecfac2bb..d69b39be8b96b 100644 --- a/libcxx/include/__configuration/availability.h +++ b/libcxx/include/__configuration/availability.h @@ -123,9 +123,21 @@ # define _LIBCPP_INTRODUCED_IN_LLVM_20_ATTRIBUTE __attribute__((unavailable)) // LLVM 19 -// TODO: Fill this in -# define _LIBCPP_INTRODUCED_IN_LLVM_19 0 -# define _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE __attribute__((unavailable)) +# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 150400) || \ + (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 180400) || \ + (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 180400) || \ + (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 110400) || \ + (defined(__ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ < 90400) +# define _LIBCPP_INTRODUCED_IN_LLVM_19 0 +# else +# define _LIBCPP_INTRODUCED_IN_LLVM_19 1 +# endif +# define _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE \ + __attribute__((availability(macos, strict, introduced = 15.4))) \ + __attribute__((availability(ios, strict, introduced = 18.4))) \ + __attribute__((availability(tvos, strict, introduced = 18.4))) \ + __attribute__((availability(watchos, strict, introduced = 11.4))) \ + __attribute__((availability(bridgeos, strict, introduced = 9.4))) // LLVM 18 # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 150000) || \ From 310f9956c60149a4ee29489790376d4bab1da92f Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Thu, 15 May 2025 11:04:35 -0400 Subject: [PATCH 2/5] Add forgotten Lit features --- libcxx/utils/libcxx/test/features.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py index 7d6e78de343c5..a1deb3a3f746d 100644 --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -733,17 +733,24 @@ def check_gdb(cfg): # Helpers to define correspondances between LLVM versions and vendor system versions. # Those are used for backdeployment features below, do not use directly in tests. DEFAULT_FEATURES += [ + Feature( + name="_target-has-llvm-19", + when=lambda cfg: BooleanExpression.evaluate( + "_target-has-llvm-20 || target={{.+}}-apple-macosx{{15.[4-9](.\d+)?}}", + cfg.available_features, + ), + ), Feature( name="_target-has-llvm-18", when=lambda cfg: BooleanExpression.evaluate( - "target={{.+}}-apple-macosx{{15(.[0-9]+)?(.[0-9]+)?}}", + "_target-has-llvm-19 || target={{.+}}-apple-macosx{{15.[0-3](.\d+)?}}", cfg.available_features, ), ), Feature( name="_target-has-llvm-17", when=lambda cfg: BooleanExpression.evaluate( - "_target-has-llvm-18 || target={{.+}}-apple-macosx{{14.[4-9](.[0-9]+)?}} || target={{.+}}-apple-macosx{{1[5-9]([.].+)?}}", + "_target-has-llvm-18 || target={{.+}}-apple-macosx{{14.[4-9](.\d+)?}}", cfg.available_features, ), ), From 86f44ef9d5e4190c70abc1485269726627e90da8 Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Fri, 31 Oct 2025 13:00:23 -0700 Subject: [PATCH 3/5] Remove XFAILs that shouldn't be required anymore --- .../ios.base/ios.base.cons/dtor.uninitialized.pass.cpp | 3 +-- .../file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp | 3 +-- .../input.streams/istream.unformatted/sync.pass.cpp | 3 +-- .../locale.num.get/facet.num.get.members/get_double.pass.cpp | 3 +-- .../locale.num.get/facet.num.get.members/get_float.pass.cpp | 3 +-- .../facet.num.get.members/get_long_double.pass.cpp | 3 +-- libcxxabi/test/uncaught_exception.pass.cpp | 3 +-- 7 files changed, 7 insertions(+), 14 deletions(-) diff --git a/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp b/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp index 16d66e3be14ee..e5d48a35f4fd7 100644 --- a/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp +++ b/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp @@ -10,8 +10,7 @@ // The fix for issue 57964 requires an updated dylib due to explicit // instantiations. That means Apple backdeployment targets remain broken. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19 // diff --git a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp index 00aa97a45cc24..72af0a2db1180 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp @@ -12,8 +12,7 @@ // This test requires the fix to https://llvm.org/PR60509 in the dylib, // which landed in 5afb937d8a30445642ccaf33866ee4cdd0713222. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19 #include #include diff --git a/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp b/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp index b04d2c07ebb1c..79d20ce68d11b 100644 --- a/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp +++ b/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp @@ -13,8 +13,7 @@ // The fix for bug 51497 and bug 51499 require and updated dylib due to // explicit instantiations. That means Apple backdeployment targets remain // broken. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19 #include #include diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp index 31682fea43bc4..a388c0b15a840 100644 --- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp @@ -8,8 +8,7 @@ // The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of // FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19 // diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp index 57eedc8633be3..596d81cbc8c91 100644 --- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp @@ -8,8 +8,7 @@ // The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of // FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19 // diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp index 8324ee317014d..8a9fd41501626 100644 --- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp @@ -8,8 +8,7 @@ // The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of // FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19 // diff --git a/libcxxabi/test/uncaught_exception.pass.cpp b/libcxxabi/test/uncaught_exception.pass.cpp index e97732006e110..cace88a309d0b 100644 --- a/libcxxabi/test/uncaught_exception.pass.cpp +++ b/libcxxabi/test/uncaught_exception.pass.cpp @@ -15,8 +15,7 @@ // to undefined symbols when linking against a libc++ that re-exports the symbols, // but running against a libc++ that doesn't. Fortunately, usage of __cxa_uncaught_exception() // in the wild seems to be close to non-existent. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19 #include #include From e0e51a0689d94a4f15b3e451b84dc7ffc1468465 Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Sun, 2 Nov 2025 09:27:39 -0800 Subject: [PATCH 4/5] Also add LLVM 20 availability --- libcxx/include/__configuration/availability.h | 20 ++++++++++++++++--- .../string.capacity/over_max_size.pass.cpp | 6 ------ libcxx/utils/libcxx/test/features.py | 7 +++++++ libcxxabi/test/test_demangle.pass.cpp | 4 ++++ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/libcxx/include/__configuration/availability.h b/libcxx/include/__configuration/availability.h index d69b39be8b96b..5433df872fa39 100644 --- a/libcxx/include/__configuration/availability.h +++ b/libcxx/include/__configuration/availability.h @@ -118,9 +118,23 @@ # define _LIBCPP_INTRODUCED_IN_LLVM_21_ATTRIBUTE __attribute__((unavailable)) // LLVM 20 -// TODO: Fill this in -# define _LIBCPP_INTRODUCED_IN_LLVM_20 0 -# define _LIBCPP_INTRODUCED_IN_LLVM_20_ATTRIBUTE __attribute__((unavailable)) +// +// Note that versions for most Apple OSes were bumped forward and aligned in that release. +# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 260000) || \ + (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 260000) || \ + (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 260000) || \ + (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 260000) || \ + (defined(__ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ < 100000) +# define _LIBCPP_INTRODUCED_IN_LLVM_20 0 +# else +# define _LIBCPP_INTRODUCED_IN_LLVM_20 1 +# endif +# define _LIBCPP_INTRODUCED_IN_LLVM_20_ATTRIBUTE \ + __attribute__((availability(macos, strict, introduced = 26.0))) \ + __attribute__((availability(ios, strict, introduced = 26.0))) \ + __attribute__((availability(tvos, strict, introduced = 26.0))) \ + __attribute__((availability(watchos, strict, introduced = 26.0))) \ + __attribute__((availability(bridgeos, strict, introduced = 10.0))) // LLVM 19 # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 150400) || \ diff --git a/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp index 5eb3240699a81..b919551c9f880 100644 --- a/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp @@ -8,12 +8,6 @@ // UNSUPPORTED: no-exceptions -// After changing the alignment of the allocated pointer from 16 to 8, the exception -// thrown is no longer `bad_alloc` but instead length_error on systems using new -// headers but a dylib that doesn't contain 04ce0ba. -// -// XFAIL: using-built-library-before-llvm-19 - // // size_type max_size() const; // constexpr since C++20 diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py index a1deb3a3f746d..d9610c2b45400 100644 --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -733,6 +733,13 @@ def check_gdb(cfg): # Helpers to define correspondances between LLVM versions and vendor system versions. # Those are used for backdeployment features below, do not use directly in tests. DEFAULT_FEATURES += [ + Feature( + name="_target-has-llvm-20", + when=lambda cfg: BooleanExpression.evaluate( + "_target-has-llvm-21 || target={{.+}}-apple-macosx26.{{\d+(.\d+)?}}", + cfg.available_features, + ), + ), Feature( name="_target-has-llvm-19", when=lambda cfg: BooleanExpression.evaluate( diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index 858347bedce15..6790d7074a8b7 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -13,6 +13,10 @@ // dd8b266ef. // UNSUPPORTED: using-built-library-before-llvm-20 +// This test exercises support for BitInt demangling introduced in +// 20f56d140909a01c74e9981835373eaab6021af9. +// UNSUPPORTED: using-built-library-before-llvm-21 + // XFAIL: win32-broken-printf-a-precision #include "support/timer.h" From eadd621b0d71ec4c9b57f381ca408dfbdff3bcf3 Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Sun, 2 Nov 2025 12:22:13 -0800 Subject: [PATCH 5/5] Adjust XFAIL for over_max_size test --- .../string.capacity/over_max_size.pass.cpp | 8 ++++++++ libcxx/utils/libcxx/test/features.py | 18 ++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp index b919551c9f880..8e5919539d94e 100644 --- a/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp @@ -8,6 +8,14 @@ // UNSUPPORTED: no-exceptions +// This test fails when using a built library that does not contain +// 15860446a8c3, which changed the return value of max_size(). Without +// that change, the built library believes the max size to be one greater +// than it really is, and we fail to throw `length_error` from `string::resize()`, +// which is explicitly instantiated in the built library. +// +// XFAIL: using-built-library-before-llvm-21 + // // size_type max_size() const; // constexpr since C++20 diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py index d9610c2b45400..5da1d9afee911 100644 --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -733,10 +733,24 @@ def check_gdb(cfg): # Helpers to define correspondances between LLVM versions and vendor system versions. # Those are used for backdeployment features below, do not use directly in tests. DEFAULT_FEATURES += [ + Feature( + name="_target-has-llvm-22", + when=lambda cfg: BooleanExpression.evaluate( + "TBD", + cfg.available_features, + ), + ), + Feature( + name="_target-has-llvm-21", + when=lambda cfg: BooleanExpression.evaluate( + "TBD", + cfg.available_features, + ), + ), Feature( name="_target-has-llvm-20", when=lambda cfg: BooleanExpression.evaluate( - "_target-has-llvm-21 || target={{.+}}-apple-macosx26.{{\d+(.\d+)?}}", + "_target-has-llvm-21 || target={{.+}}-apple-macosx{{26.[0-9](.\d+)?}}", cfg.available_features, ), ), @@ -835,7 +849,7 @@ def check_gdb(cfg): # a libc++ flavor that enables availability markup. Similarly, a test could fail when # run against the system library of an older version of FreeBSD, even though FreeBSD # doesn't provide availability markup at the time of writing this. -for version in ("12", "13", "14", "15", "16", "17", "18", "19", "20"): +for version in ("12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22"): DEFAULT_FEATURES.append( Feature( name="using-built-library-before-llvm-{}".format(version),