From c00f4f5fb3f0b482cc50d459b0f89af4ddb0ec1a Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 8 Jun 2015 14:03:45 +0100 Subject: [PATCH] re PR libstdc++/66441 (wstring_convert not working correctly) PR libstdc++/66441 * testsuite/22_locale/conversions/string/66441.cc: New. * include/bits/locale_conv.h (__do_str_codecvt): Reserve enough space in the output string for BOM and complete result. From-SVN: r224222 --- libstdc++-v3/ChangeLog | 5 ++ libstdc++-v3/include/bits/locale_conv.h | 4 +- .../22_locale/conversions/string/66441.cc | 49 +++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 libstdc++-v3/testsuite/22_locale/conversions/string/66441.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2aa8f0c3aa9..bf985ccf7ee 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,10 @@ 2015-06-08 Jonathan Wakely + PR libstdc++/66441 + * testsuite/22_locale/conversions/string/66441.cc: New. + * include/bits/locale_conv.h (__do_str_codecvt): Reserve enough space + in the output string for BOM and complete result. + PR libstdc++/66417 * src/c++11/codecvt.cc (write_utf16_code_point): Use adjust_byte_order for single UTF-16 units. diff --git a/libstdc++-v3/include/bits/locale_conv.h b/libstdc++-v3/include/bits/locale_conv.h index 8b0a77ce317..61b535c57de 100644 --- a/libstdc++-v3/include/bits/locale_conv.h +++ b/libstdc++-v3/include/bits/locale_conv.h @@ -60,12 +60,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { size_t __outchars = 0; auto __next = __first; - const auto __maxlen = __cvt.max_length(); + const auto __maxlen = __cvt.max_length() + 1; codecvt_base::result __result; do { - __outstr.resize(__outstr.size() + (__last - __next) + __maxlen); + __outstr.resize(__outstr.size() + (__last - __next) * __maxlen); auto __outnext = &__outstr.front() + __outchars; auto const __outlast = &__outstr.back() + 1; __result = (__cvt.*__fn)(__state, __next, __last, __next, diff --git a/libstdc++-v3/testsuite/22_locale/conversions/string/66441.cc b/libstdc++-v3/testsuite/22_locale/conversions/string/66441.cc new file mode 100644 index 00000000000..b72edc8aca8 --- /dev/null +++ b/libstdc++-v3/testsuite/22_locale/conversions/string/66441.cc @@ -0,0 +1,49 @@ +// Copyright (C) 2015 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++11" } + +// libstdc++/66441 + +#include +#include +#include + +void +test01() +{ + // convert from UCS-4 to UTF16BE with BOM. + using cvt = std::codecvt_utf16; + std::wstring_convert conv; + auto to = conv.to_bytes(U"ab\u00e7"); + + VERIFY( to.length() == 8 ); + VERIFY( (unsigned char)to[0] == 0xfe ); + VERIFY( (unsigned char)to[1] == 0xff ); + VERIFY( (unsigned char)to[2] == 0x00 ); + VERIFY( (unsigned char)to[3] == 0x61 ); + VERIFY( (unsigned char)to[4] == 0x00 ); + VERIFY( (unsigned char)to[5] == 0x62 ); + VERIFY( (unsigned char)to[6] == 0x00 ); + VERIFY( (unsigned char)to[7] == 0xe7 ); +} + +int +main() +{ + test01(); +} -- 2.30.2