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);
     }
 }