https://github.com/mstorsjo updated https://github.com/llvm/llvm-project/pull/139468
From 79e10b190029b749e042d1aaec3ee697a2f5d41a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <mar...@martin.st> Date: Fri, 28 Feb 2025 20:43:46 -0100 Subject: [PATCH 1/4] [libcxx] Provide locale conversions to tests through lit substitution (#105651) There are 2 problems today that this PR resolves: libcxx tests assume the thousands separator for fr_FR locale is x00A0 on Windows. This currently fails when run on newer versions of Windows (it seems to have been updated to the new correct value of 0x202F around windows 11. The exact windows version where it changed doesn't seem to be documented anywhere). Depending the OS version, you need different values. There are several ifdefs to determine the environment/platform-specific locale conversion values and it leads to maintenance as things change over time. This PR includes the following changes: - Provide the environment's locale conversion values through a substitution. The test can opt in by placing the substitution value in a define flag. - Remove the platform ifdefs (the swapping of values between Windows, Linux, Apple, AIX). This is accomplished through a lit feature action that fetches the environment's locale conversions (lconv) for members like 'thousands_sep' that we need to provide. This should ensure that we don't lose the effectiveness of the test itself. In addition, as a result of the above, this PR: - Fixes a handful of locale tests which unexpectedly fail on newer Windows versions. - Resolves 3 XFAIL FIX-MEs. Originally submitted in https://github.com/llvm/llvm-project/pull/86649. Co-authored-by: Rodrigo Salazar <4rodrigosala...@gmail.com> (cherry picked from commit f909b2229ac16ae3898d8b158bee85c384173dfa) --- .../get_long_double_fr_FR.pass.cpp | 5 +- .../get_long_double_ru_RU.pass.cpp | 5 +- .../put_long_double_fr_FR.pass.cpp | 5 +- .../put_long_double_ru_RU.pass.cpp | 5 +- .../thousands_sep.pass.cpp | 34 ++----- .../thousands_sep.pass.cpp | 20 ++-- .../time.duration.nonmember/ostream.pass.cpp | 24 ++--- libcxx/test/support/locale_helpers.h | 37 ++------ libcxx/utils/libcxx/test/features.py | 91 ++++++++++++++++++- 9 files changed, 138 insertions(+), 88 deletions(-) diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp index bbb67d694970a..f02241ad36a5b 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp @@ -13,6 +13,8 @@ // REQUIRES: locale.fr_FR.UTF-8 +// ADDITIONAL_COMPILE_FLAGS: -DFR_MON_THOU_SEP=%{LOCALE_CONV_FR_FR_UTF_8_MON_THOUSANDS_SEP} + // <locale> // class money_get<charT, InputIterator> @@ -59,7 +61,8 @@ class my_facetw }; static std::wstring convert_thousands_sep(std::wstring const& in) { - return LocaleHelpers::convert_thousands_sep_fr_FR(in); + const wchar_t fr_sep = LocaleHelpers::mon_thousands_sep_or_default(FR_MON_THOU_SEP); + return LocaleHelpers::convert_thousands_sep(in, fr_sep); } #endif // TEST_HAS_NO_WIDE_CHARACTERS diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp index e680f2ea8816a..371cf0e90c8d3 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp @@ -11,6 +11,8 @@ // REQUIRES: locale.ru_RU.UTF-8 +// ADDITIONAL_COMPILE_FLAGS: -DRU_MON_THOU_SEP=%{LOCALE_CONV_RU_RU_UTF_8_MON_THOUSANDS_SEP} + // XFAIL: glibc-old-ru_RU-decimal-point // <locale> @@ -52,7 +54,8 @@ class my_facetw }; static std::wstring convert_thousands_sep(std::wstring const& in) { - return LocaleHelpers::convert_thousands_sep_ru_RU(in); + const wchar_t ru_sep = LocaleHelpers::mon_thousands_sep_or_default(RU_MON_THOU_SEP); + return LocaleHelpers::convert_thousands_sep(in, ru_sep); } #endif // TEST_HAS_NO_WIDE_CHARACTERS diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp index 47a48deb3368c..9ac95cc52ac07 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp @@ -13,6 +13,8 @@ // REQUIRES: locale.fr_FR.UTF-8 +// ADDITIONAL_COMPILE_FLAGS: -DFR_MON_THOU_SEP=%{LOCALE_CONV_FR_FR_UTF_8_MON_THOUSANDS_SEP} + // <locale> // class money_put<charT, OutputIterator> @@ -59,7 +61,8 @@ class my_facetw }; static std::wstring convert_thousands_sep(std::wstring const& in) { - return LocaleHelpers::convert_thousands_sep_fr_FR(in); + const wchar_t fr_sep = LocaleHelpers::mon_thousands_sep_or_default(FR_MON_THOU_SEP); + return LocaleHelpers::convert_thousands_sep(in, fr_sep); } #endif // TEST_HAS_NO_WIDE_CHARACTERS diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp index 4aea1016e735b..be1e397488468 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp @@ -11,6 +11,8 @@ // REQUIRES: locale.ru_RU.UTF-8 +// ADDITIONAL_COMPILE_FLAGS: -DRU_MON_THOU_SEP=%{LOCALE_CONV_RU_RU_UTF_8_MON_THOUSANDS_SEP} + // XFAIL: glibc-old-ru_RU-decimal-point // <locale> @@ -52,7 +54,8 @@ class my_facetw }; static std::wstring convert_thousands_sep(std::wstring const& in) { - return LocaleHelpers::convert_thousands_sep_ru_RU(in); + const wchar_t ru_sep = LocaleHelpers::mon_thousands_sep_or_default(RU_MON_THOU_SEP); + return LocaleHelpers::convert_thousands_sep(in, ru_sep); } #endif // TEST_HAS_NO_WIDE_CHARACTERS diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp index 2a70741d2a0fa..6b6570576a082 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp @@ -9,13 +9,14 @@ // NetBSD does not support LC_MONETARY at the moment // XFAIL: netbsd -// XFAIL: LIBCXX-FREEBSD-FIXME - // REQUIRES: locale.en_US.UTF-8 // REQUIRES: locale.fr_FR.UTF-8 // REQUIRES: locale.ru_RU.UTF-8 // REQUIRES: locale.zh_CN.UTF-8 +// ADDITIONAL_COMPILE_FLAGS: -DFR_MON_THOU_SEP=%{LOCALE_CONV_FR_FR_UTF_8_MON_THOUSANDS_SEP} +// ADDITIONAL_COMPILE_FLAGS: -DRU_MON_THOU_SEP=%{LOCALE_CONV_RU_RU_UTF_8_MON_THOUSANDS_SEP} + // <locale> // class moneypunct_byname<charT, International> @@ -27,6 +28,7 @@ #include <cassert> #include "test_macros.h" +#include "locale_helpers.h" #include "platform_support.h" // locale name macros class Fnf @@ -110,17 +112,10 @@ int main(int, char**) Fnt f(LOCALE_fr_FR_UTF_8, 1); assert(f.thousands_sep() == ' '); } - // The below tests work around GLIBC's use of U202F as mon_thousands_sep. + #ifndef TEST_HAS_NO_WIDE_CHARACTERS -#if defined(_CS_GNU_LIBC_VERSION) - const wchar_t fr_sep = glibc_version_less_than("2.27") ? L' ' : L'\u202F'; -#elif defined(_WIN32) - const wchar_t fr_sep = L'\u00A0'; -#elif defined(_AIX) - const wchar_t fr_sep = L'\u202F'; -#else - const wchar_t fr_sep = L' '; -#endif + const wchar_t fr_sep = LocaleHelpers::mon_thousands_sep_or_default(FR_MON_THOU_SEP); + { Fwf f(LOCALE_fr_FR_UTF_8, 1); assert(f.thousands_sep() == fr_sep); @@ -140,19 +135,8 @@ int main(int, char**) assert(f.thousands_sep() == sep); } #ifndef TEST_HAS_NO_WIDE_CHARACTERS - // The below tests work around GLIBC's use of U00A0 as mon_thousands_sep - // and U002E as mon_decimal_point. - // TODO: Fix thousands_sep for 'char'. - // related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=16006 -# if defined(_CS_GNU_LIBC_VERSION) - // FIXME libc++ specifically works around \u00A0 by translating it into - // a regular space. - const wchar_t wsep = glibc_version_less_than("2.27") ? L'\u00A0' : L'\u202F'; -# elif defined(_WIN32) || defined(_AIX) - const wchar_t wsep = L'\u00A0'; -# else - const wchar_t wsep = L' '; -# endif + const wchar_t wsep = LocaleHelpers::mon_thousands_sep_or_default(RU_MON_THOU_SEP); + { Fwf f(LOCALE_ru_RU_UTF_8, 1); assert(f.thousands_sep() == wsep); diff --git a/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp b/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp index 850352b3bc1ec..ccecd85f2ff87 100644 --- a/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp @@ -14,6 +14,8 @@ // REQUIRES: locale.en_US.UTF-8 // REQUIRES: locale.fr_FR.UTF-8 +// ADDITIONAL_COMPILE_FLAGS: -DFR_THOU_SEP=%{LOCALE_CONV_FR_FR_UTF_8_THOUSANDS_SEP} + // <locale> // template <class charT> class numpunct_byname; @@ -25,6 +27,7 @@ #include <cassert> #include "test_macros.h" +#include "locale_helpers.h" #include "platform_support.h" // locale name macros int main(int, char**) @@ -74,18 +77,11 @@ int main(int, char**) } #ifndef TEST_HAS_NO_WIDE_CHARACTERS { -#if defined(_CS_GNU_LIBC_VERSION) - const wchar_t wsep = glibc_version_less_than("2.27") ? L' ' : L'\u202f'; -# elif defined(_AIX) - const wchar_t wsep = L'\u202F'; -# elif defined(_WIN32) - const wchar_t wsep = L'\u00A0'; -# else - const wchar_t wsep = L','; -# endif - typedef wchar_t C; - const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l); - assert(np.thousands_sep() == wsep); + const wchar_t wsep = LocaleHelpers::thousands_sep_or_default(FR_THOU_SEP); + + typedef wchar_t C; + const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l); + assert(np.thousands_sep() == wsep); } #endif // TEST_HAS_NO_WIDE_CHARACTERS } diff --git a/libcxx/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp b/libcxx/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp index aecb96b58719e..ebf907a49c43e 100644 --- a/libcxx/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp +++ b/libcxx/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp @@ -16,6 +16,9 @@ // REQUIRES: locale.fr_FR.UTF-8 // REQUIRES: locale.ja_JP.UTF-8 +// ADDITIONAL_COMPILE_FLAGS: -DFR_THOU_SEP=%{LOCALE_CONV_FR_FR_UTF_8_THOUSANDS_SEP} +// ADDITIONAL_COMPILE_FLAGS: -DFR_DEC_POINT=%{LOCALE_CONV_FR_FR_UTF_8_DECIMAL_POINT} + // <chrono> // template<class Rep, class Period = ratio<1>> class duration; @@ -33,6 +36,7 @@ #include <sstream> #include "make_string.h" +#include "locale_helpers.h" #include "platform_support.h" // locale name macros #include "test_macros.h" @@ -88,21 +92,11 @@ static void test_values() { assert(stream_fr_FR_locale<CharT>(1'000.123456s) == SV("1 000,1235s")); #endif } else { -#ifdef _WIN32 - assert(stream_fr_FR_locale<CharT>(-1'000'000s) == SV("-1\u00A0000\u00A0000s")); - assert(stream_fr_FR_locale<CharT>(1'000'000s) == SV("1\u00A0000\u00A0000s")); - assert(stream_fr_FR_locale<CharT>(-1'000.123456s) == SV("-1\u00A0000,1235s")); - assert(stream_fr_FR_locale<CharT>(1'000.123456s) == SV("1\u00A0000,1235s")); -#elif defined(__APPLE__) - assert(stream_fr_FR_locale<CharT>(-1'000'000s) == SV("-1000000s")); - assert(stream_fr_FR_locale<CharT>(1'000'000s) == SV("1000000s")); - assert(stream_fr_FR_locale<CharT>(-1'000.123456s) == SV("-1000,1235s")); - assert(stream_fr_FR_locale<CharT>(1'000.123456s) == SV("1000,1235s")); -#else - assert(stream_fr_FR_locale<CharT>(-1'000'000s) == SV("-1\u202f000\u202f000s")); - assert(stream_fr_FR_locale<CharT>(1'000'000s) == SV("1\u202f000\u202f000s")); - assert(stream_fr_FR_locale<CharT>(-1'000.123456s) == SV("-1\u202f000,1235s")); - assert(stream_fr_FR_locale<CharT>(1'000.123456s) == SV("1\u202f000,1235s")); +#ifndef TEST_HAS_NO_WIDE_CHARACTERS + assert(stream_fr_FR_locale<CharT>(-1'000'000s) == L"-1" FR_THOU_SEP "000" FR_THOU_SEP "000s"); + assert(stream_fr_FR_locale<CharT>(1'000'000s) == L"1" FR_THOU_SEP "000" FR_THOU_SEP "000s"); + assert(stream_fr_FR_locale<CharT>(-1'000.123456s) == L"-1" FR_THOU_SEP "000" FR_DEC_POINT "1235s"); + assert(stream_fr_FR_locale<CharT>(1'000.123456s) == L"1" FR_THOU_SEP "000" FR_DEC_POINT "1235s"); #endif } diff --git a/libcxx/test/support/locale_helpers.h b/libcxx/test/support/locale_helpers.h index 3eb24ebf28f52..946c2fed0f3a5 100644 --- a/libcxx/test/support/locale_helpers.h +++ b/libcxx/test/support/locale_helpers.h @@ -41,37 +41,6 @@ std::wstring convert_thousands_sep(std::wstring const& in, wchar_t sep) { return out; } -// GLIBC 2.27 and newer use U+202F NARROW NO-BREAK SPACE as a thousands separator. -// This function converts the spaces in string inputs to U+202F if need -// be. FreeBSD's locale data also uses U+202F, since 2018. -// Windows uses U+00A0 NO-BREAK SPACE. -std::wstring convert_thousands_sep_fr_FR(std::wstring const& in) { -#if defined(_CS_GNU_LIBC_VERSION) - if (glibc_version_less_than("2.27")) - return in; - else - return convert_thousands_sep(in, L'\u202F'); -#elif defined(__FreeBSD__) - return convert_thousands_sep(in, L'\u202F'); -#elif defined(_WIN32) - return convert_thousands_sep(in, L'\u00A0'); -#else - return in; -#endif -} - -// GLIBC 2.27 uses U+202F NARROW NO-BREAK SPACE as a thousands separator. -// FreeBSD, AIX and Windows use U+00A0 NO-BREAK SPACE. -std::wstring convert_thousands_sep_ru_RU(std::wstring const& in) { -#if defined(TEST_HAS_GLIBC) - return convert_thousands_sep(in, L'\u202F'); -# elif defined(__FreeBSD__) || defined(_WIN32) || defined(_AIX) - return convert_thousands_sep(in, L'\u00A0'); -# else - return in; -# endif -} - std::wstring negate_en_US(std::wstring s) { #if defined(_WIN32) return L"(" + s + L")"; @@ -80,6 +49,12 @@ std::wstring negate_en_US(std::wstring s) { #endif } +wchar_t thousands_sep_or_default(std::wstring s) { return !s.empty() ? s[0] : L','; } + +wchar_t mon_thousands_sep_or_default(std::wstring s) { return thousands_sep_or_default(s); } + +wchar_t decimal_point_or_default(std::wstring s) { return !s.empty() ? s[0] : L'.'; } + #endif // TEST_HAS_NO_WIDE_CHARACTERS std::string negate_en_US(std::string s) { diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py index e4b413deff4db..a83dcd16b16f8 100644 --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -425,6 +425,10 @@ def _mingwSupportsModules(cfg): "fr_CA.ISO8859-1": ["fr_CA.ISO8859-1", "French_Canada.1252"], "cs_CZ.ISO8859-2": ["cs_CZ.ISO8859-2", "Czech_Czech Republic.1250"], } +provide_locale_conversions = { + "fr_FR.UTF-8": ["decimal_point", "mon_thousands_sep", "thousands_sep"], + "ru_RU.UTF-8": ["mon_thousands_sep"], +} for locale, alts in locales.items(): # Note: Using alts directly in the lambda body here will bind it to the value at the # end of the loop. Assigning it to a default argument works around this issue. @@ -432,10 +436,95 @@ def _mingwSupportsModules(cfg): Feature( name="locale.{}".format(locale), when=lambda cfg, alts=alts: hasAnyLocale(cfg, alts), - ) + actions=lambda cfg, locale=locale, alts=alts: _getLocaleFlagsAction( + cfg, locale, alts, provide_locale_conversions[locale] + ) + if locale in provide_locale_conversions + and "_LIBCPP_HAS_NO_WIDE_CHARACTERS" not in compilerMacros(cfg) + else [], + ), ) +# Provide environment locale conversions through substitutions to avoid platform specific +# maintenance. +def _getLocaleFlagsAction(cfg, locale, alts, members): + alts_list = ",".join([f'"{l}"' for l in alts]) + get_member_list = ",".join([f"lc->{m}" for m in members]) + + localeconv_info = programOutput( + cfg, + r""" + #if defined(_WIN32) && !defined(_CRT_SECURE_NO_WARNINGS) + #define _CRT_SECURE_NO_WARNINGS + #endif + #include <stdio.h> + #include <locale.h> + #include <stdlib.h> + #include <wchar.h> + + // Print each requested locale conversion member on separate lines. + int main() { + const char* locales[] = { %s }; + for (int loc_i = 0; loc_i < %d; ++loc_i) { + if (!setlocale(LC_ALL, locales[loc_i])) { + continue; // Choose first locale name that is recognized. + } + + lconv* lc = localeconv(); + const char* members[] = { %s }; + for (size_t m_i = 0; m_i < %d; ++m_i) { + if (!members[m_i]) { + printf("\n"); // member value is an empty string + continue; + } + + size_t len = mbstowcs(nullptr, members[m_i], 0); + if (len == static_cast<size_t>(-1)) { + fprintf(stderr, "mbstowcs failed unexpectedly\n"); + return 1; + } + // Include room for null terminator. Use malloc as these features + // are also used by lit configs that don't use -lc++ (libunwind tests). + wchar_t* dst = (wchar_t*)malloc((len + 1) * sizeof(wchar_t)); + size_t ret = mbstowcs(dst, members[m_i], len + 1); + if (ret == static_cast<size_t>(-1)) { + fprintf(stderr, "mbstowcs failed unexpectedly\n"); + free(dst); + return 1; + } + + for (size_t i = 0; i < len; ++i) { + if (dst[i] > 0x7F) { + printf("\\u%%04x", dst[i]); + } else { + // c++03 does not allow basic ascii-range characters in UCNs + printf("%%c", (char)dst[i]); + } + } + printf("\n"); + free(dst); + } + return 0; + } + + return 1; + } + """ + % (alts_list, len(alts), get_member_list, len(members)), + ) + valid_define_name = re.sub(r"[.-]", "_", locale).upper() + return [ + # Provide locale conversion through a substitution. + # Example: %{LOCALE_CONV_FR_FR_UTF_8_THOUSANDS_SEP} = L"\u202f" + AddSubstitution( + f"%{{LOCALE_CONV_{valid_define_name}_{member.upper()}}}", + lambda cfg, value=value: f"'L\"{value}\"'", + ) + for member, value in zip(members, localeconv_info.split("\n")) + ] + + # Add features representing the target platform name: darwin, linux, windows, etc... DEFAULT_FEATURES += [ Feature(name="darwin", when=lambda cfg: "__APPLE__" in compilerMacros(cfg)), From 88a9566221c1cd3c8fbd8d2ca934d6c75bdf89c1 Mon Sep 17 00:00:00 2001 From: Louis Dionne <ldionn...@gmail.com> Date: Mon, 17 Mar 2025 22:13:51 -0400 Subject: [PATCH 2/4] [libc++] Fix check for _LIBCPP_HAS_NO_WIDE_CHARACTERS in features.py (#131675) The patch that added the new locale Lit features was created before we switched to a 0-1 macro for _LIBCPP_HAS_WIDE_CHARACTERS, leading to that patch referring to the obsolete _LIBCPP_HAS_NO_WIDE_CHARACTERS macro that is never defined nowadays. (cherry picked from commit 297f6d9f6b215bd7f58cf500b979b94dedbba7bb) --- libcxx/utils/libcxx/test/features.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py index a83dcd16b16f8..10fc4b0afde6b 100644 --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -440,7 +440,8 @@ def _mingwSupportsModules(cfg): cfg, locale, alts, provide_locale_conversions[locale] ) if locale in provide_locale_conversions - and "_LIBCPP_HAS_NO_WIDE_CHARACTERS" not in compilerMacros(cfg) + and ("_LIBCPP_HAS_WIDE_CHARACTERS" not in compilerMacros(cfg) or + compilerMacros(cfg)["_LIBCPP_HAS_WIDE_CHARACTERS"] == "1") else [], ), ) From fa5ee96a9dadf360c8c3e1d5812b29b69f315e9f Mon Sep 17 00:00:00 2001 From: Louis Dionne <ldionn...@gmail.com> Date: Sat, 5 Apr 2025 14:53:18 -0400 Subject: [PATCH 3/4] [libc++] Bump OS version for macOS backdeployment CI jobs (#131883) In 0547e573c555, I introduced backdeployment testing on macOS using Github-provided builders. This was done by basically building libc++ on a slightly older macOS (like macOS 13) and then running against the system library on that machine. However, that created a dependency that libc++ must keep working on macOS 13, which doesn't support the latest-released Xcode. This patch solves that problem by moving the deployment testing to a newer version of macOS which supports the latest-released version of Xcode. Sadly, that also reduces the backdeployment coverage we have since we're not actually testing on older OSes, but is necessary to satisfy the documented libc++ support policy. In the future, we could improve the situation by providing a Lit configuration that allows compiling (but not running) all the tests, building the tests on a supported macOS, and then shipping those tests on an older backdeployment target in order to run them against the system library. Since that requires significant engineering, this isn't done at this time. (cherry picked from commit b4f7a2ab578957657336a598220fce6fc00f56b5) --- .github/workflows/libcxx-build-and-test.yaml | 14 ++++++++++++-- .../string.capacity/allocation_size.pass.cpp | 5 ----- .../fstreams/filebuf.virtuals/setbuf.pass.cpp | 5 +++-- .../facet.num.get.members/get_double.pass.cpp | 4 ++++ .../facet.num.get.members/get_float.pass.cpp | 4 ++++ .../facet.num.get.members/get_long_double.pass.cpp | 4 ++++ .../basic.string/string.capacity/max_size.pass.cpp | 6 ------ .../string.capacity/over_max_size.pass.cpp | 6 ++++++ 8 files changed, 33 insertions(+), 15 deletions(-) diff --git a/.github/workflows/libcxx-build-and-test.yaml b/.github/workflows/libcxx-build-and-test.yaml index 3346c1322a07c..84b2e104d260a 100644 --- a/.github/workflows/libcxx-build-and-test.yaml +++ b/.github/workflows/libcxx-build-and-test.yaml @@ -197,10 +197,20 @@ jobs: os: macos-15 - config: apple-configuration os: macos-15 + # TODO: These jobs are intended to test back-deployment (building against ToT libc++ but running against an + # older system-provided libc++.dylib). Doing this properly would require building the test suite on a + # recent macOS using a recent Clang (hence recent Xcode), and then running the actual test suite on an + # older mac. We could do that by e.g. sharing artifacts between the two jobs. + # + # However, our Lit configuration currently doesn't provide a good way to do that in a batch, so our only + # alternative is to actually build on the same host that we're going to run on. Sadly, that doesn't work + # since older macOSes don't support newer Xcodes. For now, we run the "backdeployment" jobs on recent + # macOS versions as a way to avoid rotting that configuration, but it doesn't provide a lot of additional + # coverage. - config: apple-system - os: macos-13 + os: macos-15 - config: apple-system-hardened - os: macos-13 + os: macos-15 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 diff --git a/libcxx/test/libcxx/strings/basic.string/string.capacity/allocation_size.pass.cpp b/libcxx/test/libcxx/strings/basic.string/string.capacity/allocation_size.pass.cpp index 6f127e1b62b02..77da29225957b 100644 --- a/libcxx/test/libcxx/strings/basic.string/string.capacity/allocation_size.pass.cpp +++ b/libcxx/test/libcxx/strings/basic.string/string.capacity/allocation_size.pass.cpp @@ -8,11 +8,6 @@ // <string> -// This test demonstrates the smaller allocation sizes when the alignment -// requirements of std::string are dropped from 16 to 8. -// -// XFAIL: using-built-library-before-llvm-19 - #include <algorithm> #include <cassert> #include <cstddef> 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 10435dc482367..3e09ab4d0f22a 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 @@ -10,8 +10,9 @@ // basic_streambuf<charT, traits>* setbuf(char_type* s, streamsize n) override; -// In C++23 and later, this test requires support for P2467R1 in the dylib (a3f17ba3febbd546f2342ffc780ac93b694fdc8d) -// XFAIL: (!c++03 && !c++11 && !c++14 && !c++17 && !c++20) && using-built-library-before-llvm-18 +// This test requires the fix to https://github.com/llvm/llvm-project/issues/60509 in the dylib, +// which landed in 5afb937d8a30445642ccaf33866ee4cdd0713222. +// XFAIL: using-built-library-before-llvm-19 #include <fstream> #include <cstddef> 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 1708e94b682c4..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 @@ -6,6 +6,10 @@ // //===----------------------------------------------------------------------===// +// The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of +// FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. +// XFAIL: using-built-library-before-llvm-19 + // <locale> // class num_get<charT, InputIterator> 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 8268b5419eb3e..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 @@ -6,6 +6,10 @@ // //===----------------------------------------------------------------------===// +// The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of +// FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. +// XFAIL: using-built-library-before-llvm-19 + // <locale> // class num_get<charT, InputIterator> 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 f3569ed6e5d89..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 @@ -6,6 +6,10 @@ // //===----------------------------------------------------------------------===// +// The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of +// FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. +// XFAIL: using-built-library-before-llvm-19 + // <locale> // class num_get<charT, InputIterator> diff --git a/libcxx/test/std/strings/basic.string/string.capacity/max_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/max_size.pass.cpp index b9ffffc0993af..2bf1db5254766 100644 --- a/libcxx/test/std/strings/basic.string/string.capacity/max_size.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.capacity/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 - // <string> // size_type max_size() const; // constexpr since C++20 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..5eb3240699a81 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,12 @@ // 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 + // <string> // size_type max_size() const; // constexpr since C++20 From 95d23f58b6bc8e31a5a2f027338c1f6ecab1a0f1 Mon Sep 17 00:00:00 2001 From: Mark de Wever <ko...@xs4all.nl> Date: Fri, 11 Apr 2025 17:05:30 +0200 Subject: [PATCH 4/4] [libc++] A quick-fix for the Apple CI. (#135202) The Apple runners automatically pick up newer XCode versions breaking the CI. This disables the test to get the CI green which allows us to investigate the issue properly later on. (cherry picked from commit 88e15b781506949c56936b8642774125772fdeb2) --- .../ios.base/ios.base.cons/dtor.uninitialized.pass.cpp | 5 ++++- .../file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp | 5 ++++- .../input.streams/istream.unformatted/sync.pass.cpp | 5 ++++- .../locale.collate.byname/compare.pass.cpp | 3 +++ .../get_long_double_fr_FR.pass.cpp | 5 ++++- .../get_long_double_ru_RU.pass.cpp | 3 +++ .../get_long_double_zh_CN.pass.cpp | 5 ++++- .../put_long_double_fr_FR.pass.cpp | 5 ++++- .../put_long_double_ru_RU.pass.cpp | 3 +++ .../put_long_double_zh_CN.pass.cpp | 5 ++++- .../locale.moneypunct.byname/curr_symbol.pass.cpp | 5 ++++- .../locale.moneypunct.byname/grouping.pass.cpp | 7 +++++-- .../locale.moneypunct.byname/neg_format.pass.cpp | 5 ++++- .../facet.num.get.members/get_double.pass.cpp | 5 ++++- .../facet.num.get.members/get_float.pass.cpp | 5 ++++- .../facet.num.get.members/get_long_double.pass.cpp | 5 ++++- .../locale.numpunct.byname/grouping.pass.cpp | 5 ++++- .../locale.numpunct.byname/thousands_sep.pass.cpp | 3 +++ .../time.duration/time.duration.nonmember/ostream.pass.cpp | 3 +++ libcxx/test/std/time/time.syn/formatter.duration.pass.cpp | 3 +++ libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp | 3 +++ libcxx/test/std/time/time.syn/formatter.hh_mm_ss.pass.cpp | 3 +++ .../test/std/time/time.syn/formatter.local_time.pass.cpp | 3 +++ libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp | 3 +++ libcxx/utils/generate_feature_test_macro_components.py | 1 + 25 files changed, 88 insertions(+), 15 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 e5d48a35f4fd7..c04250987e8e2 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 @@ -6,11 +6,14 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // UNSUPPORTED: no-exceptions // The fix for issue 57964 requires an updated dylib due to explicit // instantiations. That means Apple backdeployment targets remain broken. -// XFAIL: using-built-library-before-llvm-19 +// XFAIL using-built-library-before-llvm-19 // <ios> 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 3e09ab4d0f22a..d7c4088f5be00 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 @@ -6,13 +6,16 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // <fstream> // basic_streambuf<charT, traits>* setbuf(char_type* s, streamsize n) override; // This test requires the fix to https://github.com/llvm/llvm-project/issues/60509 in the dylib, // which landed in 5afb937d8a30445642ccaf33866ee4cdd0713222. -// XFAIL: using-built-library-before-llvm-19 +// XFAIL using-built-library-before-llvm-19 #include <fstream> #include <cstddef> 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 79d20ce68d11b..3b4354d0916c1 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 @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // <istream> // int sync(); @@ -13,7 +16,7 @@ // The fix for bug 51497 and bug 51499 require and updated dylib due to // explicit instantiations. That means Apple backdeployment targets remain // broken. -// XFAIL: using-built-library-before-llvm-19 +// XFAIL using-built-library-before-llvm-19 #include <istream> #include <cassert> diff --git a/libcxx/test/std/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp b/libcxx/test/std/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp index 158bd5182ecc5..4905ed40f4a24 100644 --- a/libcxx/test/std/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // Bionic has minimal locale support, investigate this later. // XFAIL: LIBCXX-ANDROID-FIXME diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp index f02241ad36a5b..4a5b3ee1ca87d 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp @@ -6,7 +6,10 @@ // //===----------------------------------------------------------------------===// -// XFAIL: darwin +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + +// XFAIL darwin // NetBSD does not support LC_MONETARY at the moment // XFAIL: netbsd diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp index 371cf0e90c8d3..f98758d086de1 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // NetBSD does not support LC_MONETARY at the moment // XFAIL: netbsd diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp index 05c09b26969f9..6980b7ae77db0 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp @@ -5,7 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -// + +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // NetBSD does not support LC_MONETARY at the moment // XFAIL: netbsd diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp index 9ac95cc52ac07..251f6b996571a 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp @@ -6,7 +6,10 @@ // //===----------------------------------------------------------------------===// -// XFAIL: darwin +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + +// XFAIL darwin // NetBSD does not support LC_MONETARY at the moment // XFAIL: netbsd diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp index be1e397488468..0455e5949c44a 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // NetBSD does not support LC_MONETARY at the moment // XFAIL: netbsd diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp index 4d581032d5642..68640fabb73b0 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp @@ -5,7 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -// + +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // NetBSD does not support LC_MONETARY at the moment // XFAIL: netbsd diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp index 620703ed64762..9c1253d47acd2 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp @@ -5,7 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -// + +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // NetBSD does not support LC_MONETARY at the moment // XFAIL: netbsd diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/grouping.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/grouping.pass.cpp index 3243db6a5cca6..830bf58ab5862 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/grouping.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/grouping.pass.cpp @@ -5,8 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -// -// XFAIL: darwin + +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + +// XFAIL darwin // // NetBSD does not support LC_MONETARY at the moment // XFAIL: netbsd diff --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp index a4a9216a7cc0c..a3e3d853524b5 100644 --- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp @@ -5,7 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -// + +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // NetBSD does not support LC_MONETARY at the moment // XFAIL: netbsd 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 a388c0b15a840..f32f7b0c18470 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 @@ -6,9 +6,12 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of // FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. -// XFAIL: using-built-library-before-llvm-19 +// XFAIL using-built-library-before-llvm-19 // <locale> 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 596d81cbc8c91..f063e67e65a0a 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 @@ -6,9 +6,12 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of // FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. -// XFAIL: using-built-library-before-llvm-19 +// XFAIL using-built-library-before-llvm-19 // <locale> 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 8a9fd41501626..29fc7a382fe41 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 @@ -6,9 +6,12 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of // FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. -// XFAIL: using-built-library-before-llvm-19 +// XFAIL using-built-library-before-llvm-19 // <locale> diff --git a/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp b/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp index 1e68bb3967f0f..a87c5e0ace28a 100644 --- a/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp @@ -5,7 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -// + +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // NetBSD does not support LC_NUMERIC at the moment // XFAIL: netbsd diff --git a/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp b/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp index ccecd85f2ff87..ef39e8aa7b685 100644 --- a/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // NetBSD does not support LC_NUMERIC at the moment // XFAIL: netbsd diff --git a/libcxx/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp b/libcxx/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp index ebf907a49c43e..a25711fc970c8 100644 --- a/libcxx/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp +++ b/libcxx/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: no-localization // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME diff --git a/libcxx/test/std/time/time.syn/formatter.duration.pass.cpp b/libcxx/test/std/time/time.syn/formatter.duration.pass.cpp index 1a471ac227987..20918927bf247 100644 --- a/libcxx/test/std/time/time.syn/formatter.duration.pass.cpp +++ b/libcxx/test/std/time/time.syn/formatter.duration.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: no-localization // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME diff --git a/libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp b/libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp index 64fb1f1586623..28a972b19dcef 100644 --- a/libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp +++ b/libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: no-localization // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME diff --git a/libcxx/test/std/time/time.syn/formatter.hh_mm_ss.pass.cpp b/libcxx/test/std/time/time.syn/formatter.hh_mm_ss.pass.cpp index 50e3963a21753..82d9b4c7540a7 100644 --- a/libcxx/test/std/time/time.syn/formatter.hh_mm_ss.pass.cpp +++ b/libcxx/test/std/time/time.syn/formatter.hh_mm_ss.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: no-localization // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME diff --git a/libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp b/libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp index f062e7ac68192..bd23337ccb318 100644 --- a/libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp +++ b/libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: no-localization // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME diff --git a/libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp b/libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp index 96e77daa0e19e..9c9c8e0de1e93 100644 --- a/libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp +++ b/libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// TODO(mordante) Investigate +// UNSUPPORTED: apple-clang + // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: no-localization // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py index a26bab8790f6a..78eafb67cc0f5 100755 --- a/libcxx/utils/generate_feature_test_macro_components.py +++ b/libcxx/utils/generate_feature_test_macro_components.py @@ -6,6 +6,7 @@ from typing import Any, Dict, List # Needed for python 3.8 compatibility. import functools import json +from libcxx.header_information import module_c_headers, module_headers, header_restrictions, headers_not_available, libcxx_root def get_libcxx_paths(): _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits