<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59083>59083</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Invalid output when using wbuffer_convert with ostringstream
</td>
</tr>
<tr>
<th>Labels</th>
<td>
libc++
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ldionne
</td>
</tr>
</table>
<pre>
The following test case was extracted from `libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/overflow.pass.cpp`: https://godbolt.org/z/Wc73box63
```c++
#include <locale>
#include <codecvt>
#include <fstream>
#include <cassert>
#include <iostream>
#include <sstream>
struct test_buf
: public std::wbuffer_convert<std::codecvt_utf8<wchar_t> >
{
typedef std::wbuffer_convert<std::codecvt_utf8<wchar_t> > base;
typedef base::char_type char_type;
typedef base::int_type int_type;
typedef base::traits_type traits_type;
explicit test_buf(std::streambuf* sb) : base(sb) {}
char_type* pbase() const {return base::pbase();}
char_type* pptr() const {return base::pptr();}
char_type* epptr() const {return base::epptr();}
void gbump(int n) {base::gbump(n);}
virtual int_type overflow(int_type c = traits_type::eof()) {return base::overflow(c);}
};
int main() {
std::ostringstream out;
test_buf f(out.rdbuf());
assert(f.sputc(0x4E51) == 0x4E51);
assert(f.sputc(0x4E52) == 0x4E52);
assert(f.sputc(0x4E53) == 0x4E53);
std::string s = out.str();
std::cout << "s = '" << s << "', s.size() = " << s.size() << std::endl;
}
```
MSVC output: `s = '乑乒乓', s.size() = 9`
GCC output: `s = '', s.size() = 0`
Libc++ output: `s = '乑', s.size() = 3`
Only the MSVC output makes sense IMO.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylVltvozgU_jXwYg0Ck4TwwEPadEYj7WgedrX7WIE5JN51bIRNkvbX7zHmFtq0I01FiTnnfJ_PzZdClS_ZX0cglRJCXbg8EAPaEJZrIJdcE7iaJmcGSlI16kS8TSh4wa5Xj361hvijTYlvoVgu-GtuuJLDJ-hxFDAlzyA5SAYo7L4ajbb69iso2qqCBoUKRRW6FNS51gGra5zai3fkaEytcYAm-BxUWShhAtUc8OsV__9hSVyo6yb2wr0X7vo3YruHefTBPk5KYy6ZaEsgXvzoHPXip_eUTJXAzuaOttKmgfx0D4sBQDPDvmPD1YcUeqmdvVHVMtOV7Rmz54QE_2y26rYQnBFbI0xZvLu4_D67lBtLPaj6EJ9bU21RfmHHvHm2XpNp2uRhojcvNZRQ_T43KbDZvPgdaqfoCDoAilE7jj_BcGkGCBnGn0Cw17nRDjUbj6gJC9caE8tneafbMVxXrU64I7rwaNoVo5sHzZwAc5nsl7RTbIise4A1x6TiskRQA6Zt5MznmZX1c-B8y1abpif7iG20-pAMZmz3yeA-21nxkhyK9lSjHqtDZJ-UCT1o5QI-I-GNaXMxVpcMm4bjdDKGud_fVrPzTVW9Z27eN87PuNjSAxzctoSN4JRz2afkZqGMbWHXOO6wrjuIas1tN_aNRKxfqAya0rWV8_HGtt9R6LYKdN0a9G8bXldP68i12t5GPAp-CUmXSPqryHiJjOfId9LgskB0VxcbqJ43yVt7hjZ2E8SHeJQ6nEcTHA9iPdN3GhQFmr8Oq8chJvNbnZMN04EsxeT-WPLhBJmH9ePPvx9tBLUt5c4ejpNzTyvvIfXSaBjQYRDfczAd2b893qW9g508-wOPZ3fIferZHa54EeVPKV6IwTvCLFxs9v9AEw0S7wnff_wMfMiizWa73YY0Cf0yi8s0TnPfcCMg-y7PeDkoB-zlCJK02jbB4swgF26O5Gad-G0jssWhj0ZtgVeKk71fiPPw86Vu1L_A7KWEa9121491Gm5j_5iVECV0XTEWVulqTVlSJSGtWJIUqwS_wBd5AUJn3hpTR8WYRNtQ673PMxpSGkVRGiXrKAoDywLhJoyStNqkReitQsANQATWEXsd8Zus86loDxqVgmujJyUuJn6QAN18yJ-35qgQUeIlSILfuZ91vv8PMy3MNA">