PR 13631 Problems in messages

François Dumont frs.dumont@gmail.com
Tue Dec 2 22:58:00 GMT 2014


So here is another proposal with all your remarks implemented.

2014-12-02  François Dumont  <fdumont@gcc.gnu.org>

     DR libstdc++/13631
     * include/bits/codecvt.h (codecvt<char, char, mbstate_t>): friend class
     std::messages<char>.
     (codecvt<wchar_t, char, mbstate_t>): friend class
     std::messages<wchar_t>.
     * config/locale/gnu/messages_member.h
     (messages<char>::do_open): Specialized.
     (messages<char>::do_close): Likewise.
     (messages<wchar_t>::do_open): Likewise.
     (messages<wchar_t>::do_close): Likewise.
     * config/locale/gnu/messages_member.cc:
     (messages<char>::do_open): Implement. Use bind_textdomain_codeset based
     on codecvt<char, char, mbstate_t>._M_c_locale_codecvt code set. Use
     internal cache to keep opened domain name with locale information.
     (messages<wchar_t>::do_open): Likewise with
     codecvt<wchar_t, char, mbstate_t>.
     (messages<char>::do_close): Implement. Clean cache information.
     (messages<wchar_t>::do_close): Likewise.
     (get_glibc_msg): New. Use dgettext rather than gettext using cached
     domain name associated to catalog id.
     (messages<char>::do_get): Use latter.
     (messages<wchar_t>::do_get): Likewise and use also cached locale
     codecvt<wchar_t, char, mbstate_t> facet to convert wchar_t default
     value to char and the result back to wchar_t.
     * testsuite/22_locale/messages/13631.cc: New.
     * testsuite/22_locale/messages/members/char/2.cc: Use also fr_FR locale
     for charset conversion to get the expected accented character.

Tested under Linux x86_64.

Ok to commit ?

François


On 02/12/2014 11:55, Jonathan Wakely wrote:
> If some user has got code that uses messages<signed char> and they
> provide a definition for messages<signed char>::do_get() their code
> will break if do_open and do_close disappear. (Realistically I doubt
> anyone is doing that though, it may not even work.)
I restored default implementation, it does no harm.
>
> This is not exception safe. You can use auto_ptr to fix it:
>
>      std::auto_ptr<Catalog_info> info(new 
> Catalog_info(_M_catalog_counter++,
>                                                        __domain, __l));
>      _M_infos.push_back(info.get());
>      return info.release()->_M_id 
Good catch.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: messages.patch
Type: text/x-patch
Size: 14093 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20141202/2282afc1/attachment.bin>


More information about the Libstdc++ mailing list