https://bugs.winehq.org/show_bug.cgi?id=53354
Bug ID: 53354 Summary: Wine should provide icu.dll Product: Wine Version: unspecified Hardware: x86-64 OS: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: -unknown Assignee: wine-bugs@winehq.org Reporter: osmanx@problemloesungsmaschine.de Distribution: ---
Created attachment 72742 --> https://bugs.winehq.org/attachment.cgi?id=72742 tzdb.exe
Windows since at least version Windows 10 19H1 ships a icu.dll in the system directory. The VS2022 (and I think also VS2019) C++ standard library in C++20 mode uses this DLL to implement the timezone database as specified by the C++ standard. The standard library loads this DLL dynamically with LoadLibraryExW (see https://github.com/microsoft/STL/blob/ef62d3fa0b8e4e2406b9bb74e916e1ca8a1df802/stl/src/tzdb.cpp#L66) and throws a std::system_error (see https://github.com/microsoft/STL/blob/ef62d3fa0b8e4e2406b9bb74e916e1ca8a1df802/stl/src/tzdb.cpp#L354 and https://github.com/microsoft/STL/blob/ef62d3fa0b8e4e2406b9bb74e916e1ca8a1df802/stl/src/tzdb.cpp#L455) when it cannot load it. In order to provide compatibility with modern Windows versions, IMHO Wine should thus ship a compatible icu.dll. A similar issue also exists for older Windows versions even on the Microsoft side (see https://github.com/microsoft/STL/issues/1911).
This issue arose since I recently modernized timezone handling in OpenMPT by using C++20 chrono. For now, I have worked around the problem in OpenMPT. See https://bugs.openmpt.org/view.php?id=1618 and https://source.openmpt.org/browse/openmpt?op=comp&compare[]=/trunk/OpenMPT/@17667&compare[]=/trunk/OpenMPT/@17668.
Simple test case: ``` // cl /std:c++20 /permissive- /EHsc /O2 /W4 tzdb.cpp
#include <chrono> #include <iostream> #include <stdexcept>
#include <windows.h>
int main() { try { std::chrono::get_tzdb_list(); } catch (const std::exception & e) { std::cerr << "FAIL: " << e.what() << std::endl; return 1; } std::cout << "OK" << std::endl; return 0; } ```
tzdb.exe attached.