#15653: std::locale broken in gcc --------------------------------+------------------------------------------- Reporter: dirk@… | Owner: mww@… Type: defect | Status: new Priority: Normal | Milestone: Component: ports | Version: 1.6.0 Keywords: | Port: gcc43 --------------------------------+------------------------------------------- Description changed by ryandesign@…: Old description:
When compiling the following code:
#include <locale> #include <iostream> #include <exception> #include <clocale>
void try_c_locale(const char* locale_name) { if( std::setlocale(LC_ALL, locale_name) == NULL ) printf("Failed to setlocale(LC_ALL, \"%s\")\n", locale_name); else printf("Succeeded in calling setlocale(LC_ALL, \"%s\")\n", locale_name); }
void try_cpp_locale(const char* locale_name) { try { std::locale my_locale(locale_name); } catch(std::exception& e) { printf("Failed ctor for std::locale with \"%s\": %s\n", locale_name, e.what()); return; }
printf("Succeeded ctor for std::locale with \"%s\"\n", locale_name); }
int main(void) { // Some locales from "locale -a" on my OS X system, here is proof // that these locales do exist on my system. Take my word for it // that "locale -a" also shows these locales existing on my linux // system as well. // // rutski@imac:~$ locale -a | tail -n 2 // C // POSIX // rutski@imac:~$ locale -a | grep en_US // en_US // en_US.ISO8859-1 // en_US.ISO8859-15 // en_US.US-ASCII // en_US.UTF-8 // rutski@imac:~$ locale -a | grep pl_PL // pl_PL // pl_PL.ISO8859-2 // pl_PL.UTF-8 // rutski@imac:~$
const char* test_locales[] = { "C", "POSIX", "en_US", "en_US.UTF-8", "pl_PL", "pl_PL.ISO8859-2" };
printf("Trying c locales...\n"); for(size_t x = 0; x < sizeof(test_locales)/sizeof(char*); x++) try_c_locale(test_locales[x]); printf("\n");
printf("Trying C++ locales...\n"); for(size_t x = 0; x < sizeof(test_locales)/sizeof(char*); x++) try_cpp_locale(test_locales[x]); }
the output clearly states there is something wrong:
Trying c locales... Succeeded in calling setlocale(LC_ALL, "C") Succeeded in calling setlocale(LC_ALL, "POSIX") Succeeded in calling setlocale(LC_ALL, "en_US") Succeeded in calling setlocale(LC_ALL, "en_US.UTF-8") Succeeded in calling setlocale(LC_ALL, "pl_PL") Succeeded in calling setlocale(LC_ALL, "pl_PL.ISO8859-2")
Trying C++ locales... Succeeded ctor for std::locale with "C" Succeeded ctor for std::locale with "POSIX" Failed ctor for std::locale with "en_US": locale::facet::_S_create_c_locale name not valid Failed ctor for std::locale with "en_US.UTF-8": locale::facet::_S_create_c_locale name not valid Failed ctor for std::locale with "pl_PL": locale::facet::_S_create_c_locale name not valid Failed ctor for std::locale with "pl_PL.ISO8859-2": locale::facet::_S_create_c_locale name not valid
a google serach delivers this:
http://groups.google.com/group/gnu.gcc.help/browse_thread/thread/99d874aed6b...
appearantly, a --enable-clocale to configure might do something
however, macport's configure stage does not allow for adding options (or I could not find it)
* could this be fixed in gcc? (in libstdc++) * could this be added to macport (adding extra configure options)
New description: When compiling the following code: {{{ #include <locale> #include <iostream> #include <exception> #include <clocale> void try_c_locale(const char* locale_name) { if( std::setlocale(LC_ALL, locale_name) == NULL ) printf("Failed to setlocale(LC_ALL, \"%s\")\n", locale_name); else printf("Succeeded in calling setlocale(LC_ALL, \"%s\")\n", locale_name); } void try_cpp_locale(const char* locale_name) { try { std::locale my_locale(locale_name); } catch(std::exception& e) { printf("Failed ctor for std::locale with \"%s\": %s\n", locale_name, e.what()); return; } printf("Succeeded ctor for std::locale with \"%s\"\n", locale_name); } int main(void) { // Some locales from "locale -a" on my OS X system, here is proof // that these locales do exist on my system. Take my word for it // that "locale -a" also shows these locales existing on my linux // system as well. // // rutski@imac:~$ locale -a | tail -n 2 // C // POSIX // rutski@imac:~$ locale -a | grep en_US // en_US // en_US.ISO8859-1 // en_US.ISO8859-15 // en_US.US-ASCII // en_US.UTF-8 // rutski@imac:~$ locale -a | grep pl_PL // pl_PL // pl_PL.ISO8859-2 // pl_PL.UTF-8 // rutski@imac:~$ const char* test_locales[] = { "C", "POSIX", "en_US", "en_US.UTF-8", "pl_PL", "pl_PL.ISO8859-2" }; printf("Trying c locales...\n"); for(size_t x = 0; x < sizeof(test_locales)/sizeof(char*); x++) try_c_locale(test_locales[x]); printf("\n"); printf("Trying C++ locales...\n"); for(size_t x = 0; x < sizeof(test_locales)/sizeof(char*); x++) try_cpp_locale(test_locales[x]); } }}} the output clearly states there is something wrong: {{{ Trying c locales... Succeeded in calling setlocale(LC_ALL, "C") Succeeded in calling setlocale(LC_ALL, "POSIX") Succeeded in calling setlocale(LC_ALL, "en_US") Succeeded in calling setlocale(LC_ALL, "en_US.UTF-8") Succeeded in calling setlocale(LC_ALL, "pl_PL") Succeeded in calling setlocale(LC_ALL, "pl_PL.ISO8859-2") Trying C++ locales... Succeeded ctor for std::locale with "C" Succeeded ctor for std::locale with "POSIX" Failed ctor for std::locale with "en_US": locale::facet::_S_create_c_locale name not valid Failed ctor for std::locale with "en_US.UTF-8": locale::facet::_S_create_c_locale name not valid Failed ctor for std::locale with "pl_PL": locale::facet::_S_create_c_locale name not valid Failed ctor for std::locale with "pl_PL.ISO8859-2": locale::facet::_S_create_c_locale name not valid }}} a google serach delivers this: http://groups.google.com/group/gnu.gcc.help/browse_thread/thread/99d874aed6b... appearantly, a `--enable-clocale` to configure might do something however, macport's configure stage does not allow for adding options (or I could not find it) * could this be fixed in gcc? (in libstdc++) * could this be added to macport (adding extra configure options) -- -- Ticket URL: <http://trac.macports.org/ticket/15653#comment:6> MacPorts <http://www.macports.org/> Ports system for Mac OS