[MacPorts] #15653: std::locale broken in gcc

MacPorts noreply at macports.org
Tue Sep 14 14:32:18 PDT 2010


#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 at imac:~$ locale -a | tail -n 2
>     // C
>     // POSIX
>     // rutski at 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 at imac:~$ locale -a | grep pl_PL
>     // pl_PL
>     // pl_PL.ISO8859-2
>     // pl_PL.UTF-8
>     // rutski at 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/99d874aed6b46fdd
>
> 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 at imac:~$ locale -a | tail -n 2
     // C
     // POSIX
     // rutski at 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 at imac:~$ locale -a | grep pl_PL
     // pl_PL
     // pl_PL.ISO8859-2
     // pl_PL.UTF-8
     // rutski at 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/99d874aed6b46fdd

 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


More information about the macports-tickets mailing list