On 22/06/2015 17:10, Jonathan Wakely wrote: > On 20/06/15 12:59 +0100, Jonathan Wakely wrote: >> On 20/06/15 12:03 +0200, François Dumont wrote: >>> Hi >>> >>> 2 experimental tests are failing in debug mode because >>> __do_str_codecvt is sometimes taking address of string front() and >>> back() even if empty. It wasn't use so not a big issue but it still >>> seems better to avoid. I propose to rather use string begin() to get >>> buffer address. >> >> But derefencing begin() is still undefined for an empty string. >> Shouldn't that fail for debug mode too? Why change one form of >> undefined behaviour that we diagnose to another form that we don't >> diagnose? >> >> It would be better if that function didn't do any work when the input >> range is empty: >> >> --- a/libstdc++-v3/include/bits/locale_conv.h >> +++ b/libstdc++-v3/include/bits/locale_conv.h >> @@ -58,6 +58,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION >> _OutStr& __outstr, const _Codecvt& __cvt, _State& >> __state, >> size_t& __count, _Fn __fn) >> { >> + if (__first == __last) >> + { >> + __outstr.clear(); >> + return true; >> + } >> +
Shouldn't it also set __count to 0 to make clear that nothing has been converted. >> size_t __outchars = 0; >> auto __next = __first; >> const auto __maxlen = __cvt.max_length() + 1; > > This makes that change, and also moves wstring_convert into the > ABI-tagged __cxx11 namespace, and fixes a copy&paste error in the > exception thrown from wbuffer_convert. > > Tested powerpc64le-linux, committed to trunk. > > François, your changes to add extra checks in std::string are still > useful separately. > Ok I will take care of this part. François