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