Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package llvm20 for openSUSE:Factory checked in at 2025-06-30 13:03:50 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/llvm20 (Old) and /work/SRC/openSUSE:Factory/.llvm20.new.7067 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "llvm20" Mon Jun 30 13:03:50 2025 rev:7 rq:1288892 version:20.1.7 Changes: -------- --- /work/SRC/openSUSE:Factory/llvm20/llvm20.changes 2025-06-02 21:59:06.965626742 +0200 +++ /work/SRC/openSUSE:Factory/.llvm20.new.7067/llvm20.changes 2025-06-30 13:04:30.776985073 +0200 @@ -1,0 +2,8 @@ +Fri Jun 20 21:33:10 UTC 2025 - Aaron Puchert <aaronpuch...@alice-dsl.net> + +- Update to version 20.1.7. + * This release contains bug-fixes for the LLVM 20.1.0 release. + This release is API and ABI compatible with 20.1.0. +- Rebase llvm-do-not-install-static-libraries.patch. + +------------------------------------------------------------------- Old: ---- clang-20.1.6.src.tar.xz clang-20.1.6.src.tar.xz.sig clang-docs-20.1.6.src.tar.xz clang-tools-extra-20.1.6.src.tar.xz clang-tools-extra-20.1.6.src.tar.xz.sig cmake-20.1.6.src.tar.xz cmake-20.1.6.src.tar.xz.sig compiler-rt-20.1.6.src.tar.xz compiler-rt-20.1.6.src.tar.xz.sig libc-20.1.6.src.tar.xz libcxx-20.1.6.src.tar.xz libcxx-20.1.6.src.tar.xz.sig libcxxabi-20.1.6.src.tar.xz libcxxabi-20.1.6.src.tar.xz.sig lld-20.1.6.src.tar.xz lld-20.1.6.src.tar.xz.sig lldb-20.1.6.src.tar.xz lldb-20.1.6.src.tar.xz.sig llvm-20.1.6.src.tar.xz llvm-20.1.6.src.tar.xz.sig llvm-docs-20.1.6.src.tar.xz openmp-20.1.6.src.tar.xz openmp-20.1.6.src.tar.xz.sig polly-20.1.6.src.tar.xz polly-20.1.6.src.tar.xz.sig runtimes-20.1.6.src.tar.xz runtimes-20.1.6.src.tar.xz.sig third-party-20.1.6.src.tar.xz third-party-20.1.6.src.tar.xz.sig New: ---- clang-20.1.7.src.tar.xz clang-20.1.7.src.tar.xz.sig clang-docs-20.1.7.src.tar.xz clang-tools-extra-20.1.7.src.tar.xz clang-tools-extra-20.1.7.src.tar.xz.sig cmake-20.1.7.src.tar.xz cmake-20.1.7.src.tar.xz.sig compiler-rt-20.1.7.src.tar.xz compiler-rt-20.1.7.src.tar.xz.sig libc-20.1.7.src.tar.xz libcxx-20.1.7.src.tar.xz libcxx-20.1.7.src.tar.xz.sig libcxxabi-20.1.7.src.tar.xz libcxxabi-20.1.7.src.tar.xz.sig lld-20.1.7.src.tar.xz lld-20.1.7.src.tar.xz.sig lldb-20.1.7.src.tar.xz lldb-20.1.7.src.tar.xz.sig llvm-20.1.7.src.tar.xz llvm-20.1.7.src.tar.xz.sig llvm-docs-20.1.7.src.tar.xz openmp-20.1.7.src.tar.xz openmp-20.1.7.src.tar.xz.sig polly-20.1.7.src.tar.xz polly-20.1.7.src.tar.xz.sig runtimes-20.1.7.src.tar.xz runtimes-20.1.7.src.tar.xz.sig third-party-20.1.7.src.tar.xz third-party-20.1.7.src.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ llvm20.spec ++++++ --- /var/tmp/diff_new_pack.Hh0Hro/_old 2025-06-30 13:04:41.265422196 +0200 +++ /var/tmp/diff_new_pack.Hh0Hro/_new 2025-06-30 13:04:41.269422364 +0200 @@ -19,7 +19,7 @@ %global _sonum 20 %global _minor %{_sonum}.1 %global _soname %{_minor}%{?_rc:-rc%_rc} -%global _patch_level 6 +%global _patch_level 7 %global _relver %{_minor}.%{_patch_level} %global _version %_relver%{?_rc:-rc%_rc} %global _itsme20 1 ++++++ clang-20.1.6.src.tar.xz -> clang-20.1.7.src.tar.xz ++++++ /work/SRC/openSUSE:Factory/llvm20/clang-20.1.6.src.tar.xz /work/SRC/openSUSE:Factory/.llvm20.new.7067/clang-20.1.7.src.tar.xz differ: char 15, line 1 ++++++ clang-docs-20.1.6.src.tar.xz -> clang-docs-20.1.7.src.tar.xz ++++++ ++++ 3558 lines of diff (skipped) ++++++ clang-tools-extra-20.1.6.src.tar.xz -> clang-tools-extra-20.1.7.src.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clang-tools-extra-20.1.6.src/clangd/InlayHints.cpp new/clang-tools-extra-20.1.7.src/clangd/InlayHints.cpp --- old/clang-tools-extra-20.1.6.src/clangd/InlayHints.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/clang-tools-extra-20.1.7.src/clangd/InlayHints.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -33,6 +33,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" +#include "llvm/ADT/identity.h" #include "llvm/Support/Casting.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FormatVariadic.h" @@ -368,7 +369,11 @@ } if (auto F = Target.getAs<FunctionProtoTypeLoc>()) { - return F; + // In some edge cases the AST can contain a "trivial" FunctionProtoTypeLoc + // which has null parameters. Avoid these as they don't contain useful + // information. + if (llvm::all_of(F.getParams(), llvm::identity<ParmVarDecl *>())) + return F; } return {}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clang-tools-extra-20.1.6.src/clangd/ModulesBuilder.cpp new/clang-tools-extra-20.1.7.src/clangd/ModulesBuilder.cpp --- old/clang-tools-extra-20.1.6.src/clangd/ModulesBuilder.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/clang-tools-extra-20.1.7.src/clangd/ModulesBuilder.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -360,9 +360,9 @@ /// Collect the directly and indirectly required module names for \param /// ModuleName in topological order. The \param ModuleName is guaranteed to /// be the last element in \param ModuleNames. -llvm::SmallVector<StringRef> getAllRequiredModules(ProjectModules &MDB, +llvm::SmallVector<std::string> getAllRequiredModules(ProjectModules &MDB, StringRef ModuleName) { - llvm::SmallVector<llvm::StringRef> ModuleNames; + llvm::SmallVector<std::string> ModuleNames; llvm::StringSet<> ModuleNamesSet; auto VisitDeps = [&](StringRef ModuleName, auto Visitor) -> void { @@ -373,7 +373,7 @@ if (ModuleNamesSet.insert(RequiredModuleName).second) Visitor(RequiredModuleName, Visitor); - ModuleNames.push_back(ModuleName); + ModuleNames.push_back(ModuleName.str()); }; VisitDeps(ModuleName, VisitDeps); @@ -418,13 +418,13 @@ // Get Required modules in topological order. auto ReqModuleNames = getAllRequiredModules(MDB, ModuleName); for (llvm::StringRef ReqModuleName : ReqModuleNames) { - if (BuiltModuleFiles.isModuleUnitBuilt(ModuleName)) + if (BuiltModuleFiles.isModuleUnitBuilt(ReqModuleName)) continue; if (auto Cached = Cache.getModule(ReqModuleName)) { if (IsModuleFileUpToDate(Cached->getModuleFilePath(), BuiltModuleFiles, TFS.view(std::nullopt))) { - log("Reusing module {0} from {1}", ModuleName, + log("Reusing module {0} from {1}", ReqModuleName, Cached->getModuleFilePath()); BuiltModuleFiles.addModuleFile(std::move(Cached)); continue; @@ -432,14 +432,16 @@ Cache.remove(ReqModuleName); } + std::string ReqFileName = + MDB.getSourceForModuleName(ReqModuleName); llvm::Expected<ModuleFile> MF = buildModuleFile( - ModuleName, ModuleUnitFileName, getCDB(), TFS, BuiltModuleFiles); + ReqModuleName, ReqFileName, getCDB(), TFS, BuiltModuleFiles); if (llvm::Error Err = MF.takeError()) return Err; - log("Built module {0} to {1}", ModuleName, MF->getModuleFilePath()); + log("Built module {0} to {1}", ReqModuleName, MF->getModuleFilePath()); auto BuiltModuleFile = std::make_shared<const ModuleFile>(std::move(*MF)); - Cache.add(ModuleName, BuiltModuleFile); + Cache.add(ReqModuleName, BuiltModuleFile); BuiltModuleFiles.addModuleFile(std::move(BuiltModuleFile)); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clang-tools-extra-20.1.6.src/clangd/ProjectModules.h new/clang-tools-extra-20.1.7.src/clangd/ProjectModules.h --- old/clang-tools-extra-20.1.6.src/clangd/ProjectModules.h 2025-05-28 00:33:46.000000000 +0200 +++ new/clang-tools-extra-20.1.7.src/clangd/ProjectModules.h 2025-06-13 06:54:32.000000000 +0200 @@ -42,7 +42,7 @@ llvm::unique_function<void(tooling::CompileCommand &, PathRef) const>; virtual std::vector<std::string> getRequiredModules(PathRef File) = 0; - virtual PathRef + virtual std::string getSourceForModuleName(llvm::StringRef ModuleName, PathRef RequiredSrcFile = PathRef()) = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clang-tools-extra-20.1.6.src/clangd/ScanningProjectModules.cpp new/clang-tools-extra-20.1.7.src/clangd/ScanningProjectModules.cpp --- old/clang-tools-extra-20.1.6.src/clangd/ScanningProjectModules.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/clang-tools-extra-20.1.7.src/clangd/ScanningProjectModules.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -66,7 +66,7 @@ /// /// TODO: We should handle the case that there are multiple source files /// declaring the same module. - PathRef getSourceForModuleName(llvm::StringRef ModuleName) const; + std::string getSourceForModuleName(llvm::StringRef ModuleName) const; /// Return the direct required modules. Indirect required modules are not /// included. @@ -140,7 +140,7 @@ GlobalScanned = true; } -PathRef ModuleDependencyScanner::getSourceForModuleName( +std::string ModuleDependencyScanner::getSourceForModuleName( llvm::StringRef ModuleName) const { assert( GlobalScanned && @@ -189,7 +189,7 @@ /// RequiredSourceFile is not used intentionally. See the comments of /// ModuleDependencyScanner for detail. - PathRef + std::string getSourceForModuleName(llvm::StringRef ModuleName, PathRef RequiredSourceFile = PathRef()) override { Scanner.globalScan(Mangler); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clang-tools-extra-20.1.6.src/clangd/test/module_dependencies.test new/clang-tools-extra-20.1.7.src/clangd/test/module_dependencies.test --- old/clang-tools-extra-20.1.6.src/clangd/test/module_dependencies.test 1970-01-01 01:00:00.000000000 +0100 +++ new/clang-tools-extra-20.1.7.src/clangd/test/module_dependencies.test 2025-06-13 06:54:32.000000000 +0200 @@ -0,0 +1,95 @@ +# A smoke test to check that a simple dependency chain for modules can work. +# +# FIXME: The test fails on Windows; see comments on https://github.com/llvm/llvm-project/pull/142828 +# UNSUPPORTED: system-windows +# +# RUN: rm -fr %t +# RUN: mkdir -p %t +# RUN: split-file %s %t +# +# RUN: sed -e "s|DIR|%/t|g" %t/compile_commands.json.tmpl > %t/compile_commands.json.tmp +# RUN: sed -e "s|CLANG_CC|%clang|g" %t/compile_commands.json.tmp > %t/compile_commands.json +# RUN: sed -e "s|DIR|%/t|g" %t/definition.jsonrpc.tmpl > %t/definition.jsonrpc.tmp +# +# On Windows, we need the URI in didOpen to look like "uri":"file:///C:/..." +# (with the extra slash in the front), so we add it here. +# RUN: sed -E -e 's|"file://([A-Z]):/|"file:///\1:/|g' %/t/definition.jsonrpc.tmp > %/t/definition.jsonrpc +# +# RUN: clangd -experimental-modules-support -lit-test < %t/definition.jsonrpc \ +# RUN: | FileCheck -strict-whitespace %t/definition.jsonrpc + +#--- A-frag.cppm +export module A:frag; +export void printA() {} + +#--- A.cppm +export module A; +export import :frag; + +#--- Use.cpp +import A; +void foo() { + print +} + +#--- compile_commands.json.tmpl +[ + { + "directory": "DIR", + "command": "CLANG_CC -fprebuilt-module-path=DIR -std=c++20 -o DIR/main.cpp.o -c DIR/Use.cpp", + "file": "DIR/Use.cpp" + }, + { + "directory": "DIR", + "command": "CLANG_CC -std=c++20 DIR/A.cppm --precompile -o DIR/A.pcm", + "file": "DIR/A.cppm" + }, + { + "directory": "DIR", + "command": "CLANG_CC -std=c++20 DIR/A-frag.cppm --precompile -o DIR/A-frag.pcm", + "file": "DIR/A-frag.cppm" + } +] + +#--- definition.jsonrpc.tmpl +{ + "jsonrpc": "2.0", + "id": 0, + "method": "initialize", + "params": { + "processId": 123, + "rootPath": "clangd", + "capabilities": { + "textDocument": { + "completion": { + "completionItem": { + "snippetSupport": true + } + } + } + }, + "trace": "off" + } +} +--- +{ + "jsonrpc": "2.0", + "method": "textDocument/didOpen", + "params": { + "textDocument": { + "uri": "file://DIR/Use.cpp", + "languageId": "cpp", + "version": 1, + "text": "import A;\nvoid foo() {\n print\n}\n" + } + } +} + +# CHECK: "message"{{.*}}printA{{.*}}(fix available) + +--- +{"jsonrpc":"2.0","id":1,"method":"textDocument/completion","params":{"textDocument":{"uri":"file://DIR/Use.cpp"},"context":{"triggerKind":1},"position":{"line":2,"character":6}}} +--- +{"jsonrpc":"2.0","id":2,"method":"shutdown"} +--- +{"jsonrpc":"2.0","method":"exit"} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clang-tools-extra-20.1.6.src/clangd/unittests/InlayHintTests.cpp new/clang-tools-extra-20.1.7.src/clangd/unittests/InlayHintTests.cpp --- old/clang-tools-extra-20.1.6.src/clangd/unittests/InlayHintTests.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/clang-tools-extra-20.1.7.src/clangd/unittests/InlayHintTests.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -997,11 +997,16 @@ f3_t f3; using f4_t = void(__stdcall *)(int param); f4_t f4; + __attribute__((noreturn)) f4_t f5; void bar() { f1($f1[[42]]); f2($f2[[42]]); f3($f3[[42]]); f4($f4[[42]]); + // This one runs into an edge case in clang's type model + // and we can't extract the parameter name. But at least + // we shouldn't crash. + f5(42); } )cpp", ExpectedHint{"param: ", "f1"}, ExpectedHint{"param: ", "f2"}, ++++++ cmake-20.1.6.src.tar.xz -> cmake-20.1.7.src.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmake-20.1.6.src/Modules/LLVMVersion.cmake new/cmake-20.1.7.src/Modules/LLVMVersion.cmake --- old/cmake-20.1.6.src/Modules/LLVMVersion.cmake 2025-05-28 00:33:46.000000000 +0200 +++ new/cmake-20.1.7.src/Modules/LLVMVersion.cmake 2025-06-13 06:54:32.000000000 +0200 @@ -7,7 +7,7 @@ set(LLVM_VERSION_MINOR 1) endif() if(NOT DEFINED LLVM_VERSION_PATCH) - set(LLVM_VERSION_PATCH 6) + set(LLVM_VERSION_PATCH 7) endif() if(NOT DEFINED LLVM_VERSION_SUFFIX) set(LLVM_VERSION_SUFFIX) ++++++ compiler-rt-20.1.6.src.tar.xz -> compiler-rt-20.1.7.src.tar.xz ++++++ ++++++ libc-20.1.6.src.tar.xz -> libc-20.1.7.src.tar.xz ++++++ ++++++ libcxx-20.1.6.src.tar.xz -> libcxx-20.1.7.src.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/include/__flat_map/flat_map.h new/libcxx-20.1.7.src/include/__flat_map/flat_map.h --- old/libcxx-20.1.6.src/include/__flat_map/flat_map.h 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/include/__flat_map/flat_map.h 2025-06-13 06:54:32.000000000 +0200 @@ -113,7 +113,7 @@ class value_compare { private: - key_compare __comp_; + _LIBCPP_NO_UNIQUE_ADDRESS key_compare __comp_; _LIBCPP_HIDE_FROM_ABI value_compare(key_compare __c) : __comp_(__c) {} friend flat_map; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/include/__flat_map/flat_multimap.h new/libcxx-20.1.7.src/include/__flat_map/flat_multimap.h --- old/libcxx-20.1.6.src/include/__flat_map/flat_multimap.h 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/include/__flat_map/flat_multimap.h 2025-06-13 06:54:32.000000000 +0200 @@ -115,7 +115,7 @@ class value_compare { private: - key_compare __comp_; + _LIBCPP_NO_UNIQUE_ADDRESS key_compare __comp_; _LIBCPP_HIDE_FROM_ABI value_compare(key_compare __c) : __comp_(__c) {} friend flat_multimap; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp new/libcxx-20.1.7.src/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp --- old/libcxx-20.1.6.src/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -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 @@ }; 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp new/libcxx-20.1.7.src/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp --- old/libcxx-20.1.6.src/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -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 @@ }; 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp new/libcxx-20.1.7.src/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp --- old/libcxx-20.1.6.src/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -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 @@ }; 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp new/libcxx-20.1.7.src/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp --- old/libcxx-20.1.6.src/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -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 @@ }; 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp new/libcxx-20.1.7.src/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp --- old/libcxx-20.1.6.src/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -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 @@ 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 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp new/libcxx-20.1.7.src/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp --- old/libcxx-20.1.6.src/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -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 @@ } #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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp new/libcxx-20.1.7.src/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp --- old/libcxx-20.1.6.src/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/test/std/time/time.duration/time.duration.nonmember/ostream.pass.cpp 2025-06-13 06:54:32.000000000 +0200 @@ -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 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/test/support/locale_helpers.h new/libcxx-20.1.7.src/test/support/locale_helpers.h --- old/libcxx-20.1.6.src/test/support/locale_helpers.h 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/test/support/locale_helpers.h 2025-06-13 06:54:32.000000000 +0200 @@ -41,37 +41,6 @@ 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 @@ #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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-20.1.6.src/utils/libcxx/test/features.py new/libcxx-20.1.7.src/utils/libcxx/test/features.py --- old/libcxx-20.1.6.src/utils/libcxx/test/features.py 2025-05-28 00:33:46.000000000 +0200 +++ new/libcxx-20.1.7.src/utils/libcxx/test/features.py 2025-06-13 06:54:32.000000000 +0200 @@ -425,6 +425,10 @@ "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,8 +436,94 @@ 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_WIDE_CHARACTERS" not in compilerMacros(cfg) or + compilerMacros(cfg)["_LIBCPP_HAS_WIDE_CHARACTERS"] == "1") + 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... ++++++ libcxxabi-20.1.6.src.tar.xz -> libcxxabi-20.1.7.src.tar.xz ++++++ ++++++ lld-20.1.6.src.tar.xz -> lld-20.1.7.src.tar.xz ++++++ ++++++ lldb-20.1.6.src.tar.xz -> lldb-20.1.7.src.tar.xz ++++++ /work/SRC/openSUSE:Factory/llvm20/lldb-20.1.6.src.tar.xz /work/SRC/openSUSE:Factory/.llvm20.new.7067/lldb-20.1.7.src.tar.xz differ: char 15, line 1 ++++++ llvm-20.1.6.src.tar.xz -> llvm-20.1.7.src.tar.xz ++++++ /work/SRC/openSUSE:Factory/llvm20/llvm-20.1.6.src.tar.xz /work/SRC/openSUSE:Factory/.llvm20.new.7067/llvm-20.1.7.src.tar.xz differ: char 15, line 1 ++++++ llvm-do-not-install-static-libraries.patch ++++++ --- /var/tmp/diff_new_pack.Hh0Hro/_old 2025-06-30 13:04:51.657855318 +0200 +++ /var/tmp/diff_new_pack.Hh0Hro/_new 2025-06-30 13:04:51.661855485 +0200 @@ -2,10 +2,10 @@ want after installation. By not copying them in the first place we reduce the disk usage during installation. -Index: clang-20.1.6.src/cmake/modules/AddClang.cmake +Index: clang-20.1.7.src/cmake/modules/AddClang.cmake =================================================================== ---- a/clang-20.1.6.src/cmake/modules/AddClang.cmake -+++ b/clang-20.1.6.src/cmake/modules/AddClang.cmake +--- a/clang-20.1.7.src/cmake/modules/AddClang.cmake ++++ b/clang-20.1.7.src/cmake/modules/AddClang.cmake @@ -106,12 +106,15 @@ macro(add_clang_library name) if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN) @@ -73,10 +73,10 @@ endif() get_subproject_title(subproject_title) -Index: lld-20.1.6.src/cmake/modules/AddLLD.cmake +Index: lld-20.1.7.src/cmake/modules/AddLLD.cmake =================================================================== ---- a/lld-20.1.6.src/cmake/modules/AddLLD.cmake -+++ b/lld-20.1.6.src/cmake/modules/AddLLD.cmake +--- a/lld-20.1.7.src/cmake/modules/AddLLD.cmake ++++ b/lld-20.1.7.src/cmake/modules/AddLLD.cmake @@ -17,13 +17,6 @@ macro(add_lld_library name) if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) @@ -91,10 +91,10 @@ if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) add_llvm_install_targets(install-${name} DEPENDS ${name} -Index: polly-20.1.6.src/cmake/polly_macros.cmake +Index: polly-20.1.7.src/cmake/polly_macros.cmake =================================================================== ---- a/polly-20.1.6.src/cmake/polly_macros.cmake -+++ b/polly-20.1.6.src/cmake/polly_macros.cmake +--- a/polly-20.1.7.src/cmake/polly_macros.cmake ++++ b/polly-20.1.7.src/cmake/polly_macros.cmake @@ -43,16 +43,18 @@ if (LLVM_POLLY_LINK_INTO_TOOLS) set(exports EXPORT LLVMExports) @@ -125,10 +125,10 @@ endmacro(add_polly_library) macro(add_polly_loadable_module name) -Index: polly-20.1.6.src/lib/CMakeLists.txt +Index: polly-20.1.7.src/lib/CMakeLists.txt =================================================================== ---- a/polly-20.1.6.src/lib/CMakeLists.txt -+++ b/polly-20.1.6.src/lib/CMakeLists.txt +--- a/polly-20.1.7.src/lib/CMakeLists.txt ++++ b/polly-20.1.7.src/lib/CMakeLists.txt @@ -109,7 +109,7 @@ set_target_properties(PollyCore PROPERTI # It depends on all library it needs, such that with # LLVM_POLLY_LINK_INTO_TOOLS=ON, its dependencies like PollyISL are linked as ++++++ llvm-docs-20.1.6.src.tar.xz -> llvm-docs-20.1.7.src.tar.xz ++++++ /work/SRC/openSUSE:Factory/llvm20/llvm-docs-20.1.6.src.tar.xz /work/SRC/openSUSE:Factory/.llvm20.new.7067/llvm-docs-20.1.7.src.tar.xz differ: char 15, line 1 ++++++ openmp-20.1.6.src.tar.xz -> openmp-20.1.7.src.tar.xz ++++++ ++++++ polly-20.1.6.src.tar.xz -> polly-20.1.7.src.tar.xz ++++++ /work/SRC/openSUSE:Factory/llvm20/polly-20.1.6.src.tar.xz /work/SRC/openSUSE:Factory/.llvm20.new.7067/polly-20.1.7.src.tar.xz differ: char 15, line 1 ++++++ runtimes-20.1.6.src.tar.xz -> runtimes-20.1.7.src.tar.xz ++++++ ++++++ third-party-20.1.6.src.tar.xz -> third-party-20.1.7.src.tar.xz ++++++