On Thu, Sep 21, 2023 at 9:07 PM Christian Franke via Cygwin <cygwin@cygwin.com> wrote: > > Brian Inglis via Cygwin wrote: > > On 2023-09-21 10:28, Takashi Yano via Cygwin wrote: > >> On Fri, 22 Sep 2023 01:12:04 +0900 > >> Takashi Yano wrote: > >>> I wonder why the following code throws std::runtime_error > >>> even though the LC_ALL is set to valid locale other than "C". > >>> This does not occur only when LC_ALL is set to "C". > >>> > >>> #include <locale> > >>> int main() > >>> { > >>> std::locale(""); > >>> return 0; > >>> } > >>> > >>> In linux, this occurs only when the LC_ALL is set to invalid > >>> locale (i.e. locale that is not registered in system). > >> > >> Similarly, > >> std::locale("ja_JP.UTF-8") > >> throws std::runtime_error in cygwin. > > > > Looks like the implementation does not like any default "" or explicit > > "en_US.UTF-8" strings there! See example at link and below; results > > are always the same: > > > > https://en.cppreference.com/w/cpp/locale/locale > > > > #include <iostream> > > #include <locale> > > > > int main() > > { > > std::wcout << "User-preferred locale setting is " > > << std::locale().name().c_str() << '\n'; > > > > // on startup, the global locale is the "C" locale > > std::wcout << 1000.01 << '\n'; > > > > // replace the C++ global locale and the "C" locale with the > > user-preferred locale > > std::locale::global(std::locale("")); > > // use the new global locale for future wide character output > > std::wcout.imbue(std::locale()); > > > > // output the same number again > > std::wcout << 1000.01 << '\n'; > > } > > > > $ g++ -o c++locale{,.cc} > > $ ./c++locale > > User-preferred locale setting is C > > 1000.01 > > terminate called after throwing an instance of 'std::runtime_error' > > what(): locale::facet::_S_create_c_locale name not valid > > Aborted (core dumped) > > > > According to libstdc++ source, the internal function > locale::facet::_S_create_c_locale() calls some __newlocale() which > apparently does not arrive at newlocale() from cygwin1.dll. But > cygstdc++-6.dll imports newlocale() from cygwin1.dll.
So this is a BUG? > > Only standard locale "C" and its alias "POSIX" work with C++ std::locale(). > > The cygwin1.dll function newlocale() works as expected - except that it > does not set errno if the locale name is invalid. What does bash -c 'locale -a' print on your system? Thanks, Martin -- Problem reports: https://cygwin.com/problems.html FAQ: https://cygwin.com/faq/ Documentation: https://cygwin.com/docs.html Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple