From 1ca23672a0a694a6979b6e62d7893d8fe019a664 Mon Sep 17 00:00:00 2001 From: Howard Hinnant <hhinnant@apple.com> Date: Thu, 12 Jul 2012 18:07:41 +0000 Subject: [PATCH] Fixed a bug in wstring_convert concerning zero-length inputs. Thanks to Jonathan Coxhead for reporting this bug. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@160136 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/locale | 6 ++++-- .../conversions/conversions.string/from_bytes.pass.cpp | 2 ++ .../conversions/conversions.string/to_bytes.pass.cpp | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/locale b/include/locale index bec27f6d..ee0a6a0e 100644 --- a/include/locale +++ b/include/locale @@ -3920,7 +3920,8 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: if (__cvtptr_ != nullptr) { wide_string __ws(2*(__frm_end - __frm), _Elem()); - __ws.resize(__ws.capacity()); + if (__frm != __frm_end) + __ws.resize(__ws.capacity()); codecvt_base::result __r = codecvt_base::ok; state_type __st = __cvtstate_; if (__frm != __frm_end) @@ -3980,7 +3981,8 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: if (__cvtptr_ != nullptr) { byte_string __bs(2*(__frm_end - __frm), char()); - __bs.resize(__bs.capacity()); + if (__frm != __frm_end) + __bs.resize(__bs.capacity()); codecvt_base::result __r = codecvt_base::ok; state_type __st = __cvtstate_; if (__frm != __frm_end) diff --git a/test/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp b/test/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp index 08d3e185..8705a5f3 100644 --- a/test/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp +++ b/test/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp @@ -33,5 +33,7 @@ int main() assert(ws == L"\x40003"); ws = myconv.from_bytes(bs.data(), bs.data() + bs.size()); assert(ws == L"\x40003"); + ws = myconv.from_bytes(""); + assert(ws.size() == 0); } } diff --git a/test/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp b/test/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp index 4ef59891..7253a18a 100644 --- a/test/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp +++ b/test/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp @@ -33,5 +33,7 @@ int main() assert(bs == "\xF1\x80\x80\x83"); bs = myconv.to_bytes(ws.data(), ws.data() + ws.size()); assert(bs == "\xF1\x80\x80\x83"); + bs = myconv.to_bytes(L""); + assert(bs.size() == 0); } }